1 #include <libunwind.h>
2 #include <stdlib.h>
3
backtrace(int lower_bound)4 void backtrace(int lower_bound) {
5 unw_context_t context;
6 unw_getcontext(&context);
7
8 unw_cursor_t cursor;
9 unw_init_local(&cursor, &context);
10
11 int n = 0;
12 do {
13 ++n;
14 if (n > 100) {
15 abort();
16 }
17 } while (unw_step(&cursor) > 0);
18
19 if (n < lower_bound) {
20 abort();
21 }
22 }
23
test1(int i)24 void test1(int i) {
25 backtrace(i);
26 }
27
test2(int i,int j)28 void test2(int i, int j) {
29 backtrace(i);
30 test1(j);
31 }
32
test3(int i,int j,int k)33 void test3(int i, int j, int k) {
34 backtrace(i);
35 test2(j, k);
36 }
37
test_no_info()38 void test_no_info() {
39 unw_context_t context;
40 unw_getcontext(&context);
41
42 unw_cursor_t cursor;
43 unw_init_local(&cursor, &context);
44
45 unw_proc_info_t info;
46 int ret = unw_get_proc_info(&cursor, &info);
47 if (ret != UNW_ESUCCESS)
48 abort();
49
50 // Set the IP to an address clearly outside any function.
51 unw_set_reg(&cursor, UNW_REG_IP, (unw_word_t)0);
52
53 ret = unw_get_proc_info(&cursor, &info);
54 if (ret != UNW_ENOINFO)
55 abort();
56 }
57
main(int,char **)58 int main(int, char**) {
59 test1(1);
60 test2(1, 2);
61 test3(1, 2, 3);
62 test_no_info();
63 return 0;
64 }
65