2015-05-29 23:33:38 +08:00
|
|
|
#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) {
|
2017-07-06 23:20:12 +08:00
|
|
|
(void)context;
|
2015-05-29 23:33:38 +08:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-09 01:36:33 +08:00
|
|
|
int main(int, char**) {
|
2015-05-29 23:33:38 +08:00
|
|
|
int total = test(50);
|
|
|
|
assert(total == 1275);
|
2020-10-09 01:36:33 +08:00
|
|
|
return 0;
|
2015-05-29 23:33:38 +08:00
|
|
|
}
|