| #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); |
| } |