1*7fab97f3SLogan Chien #include <assert.h>
2*7fab97f3SLogan Chien #include <stdlib.h>
3*7fab97f3SLogan Chien #include <unwind.h>
4*7fab97f3SLogan Chien 
5*7fab97f3SLogan Chien #define EXPECTED_NUM_FRAMES 50
6*7fab97f3SLogan Chien #define NUM_FRAMES_UPPER_BOUND 100
7*7fab97f3SLogan Chien 
8*7fab97f3SLogan Chien _Unwind_Reason_Code callback(_Unwind_Context *context, void *cnt) {
9*7fab97f3SLogan Chien   int *i = (int *)cnt;
10*7fab97f3SLogan Chien   ++*i;
11*7fab97f3SLogan Chien   if (*i > NUM_FRAMES_UPPER_BOUND) {
12*7fab97f3SLogan Chien     abort();
13*7fab97f3SLogan Chien   }
14*7fab97f3SLogan Chien   return _URC_NO_REASON;
15*7fab97f3SLogan Chien }
16*7fab97f3SLogan Chien 
17*7fab97f3SLogan Chien void test_backtrace() {
18*7fab97f3SLogan Chien   int n = 0;
19*7fab97f3SLogan Chien   _Unwind_Backtrace(&callback, &n);
20*7fab97f3SLogan Chien   if (n < EXPECTED_NUM_FRAMES) {
21*7fab97f3SLogan Chien     abort();
22*7fab97f3SLogan Chien   }
23*7fab97f3SLogan Chien }
24*7fab97f3SLogan Chien 
25*7fab97f3SLogan Chien int test(int i) {
26*7fab97f3SLogan Chien   if (i == 0) {
27*7fab97f3SLogan Chien     test_backtrace();
28*7fab97f3SLogan Chien     return 0;
29*7fab97f3SLogan Chien   } else {
30*7fab97f3SLogan Chien     return i + test(i - 1);
31*7fab97f3SLogan Chien   }
32*7fab97f3SLogan Chien }
33*7fab97f3SLogan Chien 
34*7fab97f3SLogan Chien int main() {
35*7fab97f3SLogan Chien   int total = test(50);
36*7fab97f3SLogan Chien   assert(total == 1275);
37*7fab97f3SLogan Chien }
38