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