17fab97f3SLogan Chien #include <assert.h> 27fab97f3SLogan Chien #include <stdlib.h> 37fab97f3SLogan Chien #include <unwind.h> 47fab97f3SLogan Chien 57fab97f3SLogan Chien #define EXPECTED_NUM_FRAMES 50 67fab97f3SLogan Chien #define NUM_FRAMES_UPPER_BOUND 100 77fab97f3SLogan Chien 87fab97f3SLogan Chien _Unwind_Reason_Code callback(_Unwind_Context *context, void *cnt) { 9*6e50d93aSJonathan Roelofs (void)context; 107fab97f3SLogan Chien int *i = (int *)cnt; 117fab97f3SLogan Chien ++*i; 127fab97f3SLogan Chien if (*i > NUM_FRAMES_UPPER_BOUND) { 137fab97f3SLogan Chien abort(); 147fab97f3SLogan Chien } 157fab97f3SLogan Chien return _URC_NO_REASON; 167fab97f3SLogan Chien } 177fab97f3SLogan Chien 187fab97f3SLogan Chien void test_backtrace() { 197fab97f3SLogan Chien int n = 0; 207fab97f3SLogan Chien _Unwind_Backtrace(&callback, &n); 217fab97f3SLogan Chien if (n < EXPECTED_NUM_FRAMES) { 227fab97f3SLogan Chien abort(); 237fab97f3SLogan Chien } 247fab97f3SLogan Chien } 257fab97f3SLogan Chien 267fab97f3SLogan Chien int test(int i) { 277fab97f3SLogan Chien if (i == 0) { 287fab97f3SLogan Chien test_backtrace(); 297fab97f3SLogan Chien return 0; 307fab97f3SLogan Chien } else { 317fab97f3SLogan Chien return i + test(i - 1); 327fab97f3SLogan Chien } 337fab97f3SLogan Chien } 347fab97f3SLogan Chien 357fab97f3SLogan Chien int main() { 367fab97f3SLogan Chien int total = test(50); 377fab97f3SLogan Chien assert(total == 1275); 387fab97f3SLogan Chien } 39