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