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