| | #include <assert.h> |
| | #include <stdlib.h> |
| | #include <unwind.h> |
| |
|
| | #define EXPECTED_NUM_FRAMES 50 |
| | #define NUM_FRAMES_UPPER_BOUND 100 |
| |
|
| | _Unwind_Reason_Code callback(_Unwind_Context *context, void *cnt) { |
| | (void)context; |
| | int *i = (int *)cnt; |
| | ++*i; |
| | if (*i > NUM_FRAMES_UPPER_BOUND) { |
| | abort(); |
| | } |
| | return _URC_NO_REASON; |
| | } |
| |
|
| | void test_backtrace() { |
| | int n = 0; |
| | _Unwind_Backtrace(&callback, &n); |
| | if (n < EXPECTED_NUM_FRAMES) { |
| | abort(); |
| | } |
| | } |
| |
|
| | int test(int i) { |
| | if (i == 0) { |
| | test_backtrace(); |
| | return 0; |
| | } else { |
| | return i + test(i - 1); |
| | } |
| | } |
| |
|
| | int main() { |
| | int total = test(50); |
| | assert(total == 1275); |
| | } |
| |
|