test.c revision 71363a8075e7916c2166cbdd8a0bf5a180ed4d54
171363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes#include <corkscrew/backtrace.h> 271363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes#include <stdio.h> 371363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes#include <stdlib.h> 471363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes 571363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughesvoid do_backtrace() { 671363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes const size_t MAX_DEPTH = 32; 771363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes backtrace_frame_t* frames = (backtrace_frame_t*) malloc(sizeof(backtrace_frame_t) * MAX_DEPTH); 871363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes ssize_t frame_count = unwind_backtrace(frames, 0, MAX_DEPTH); 971363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes fprintf(stderr, "frame_count=%d\n", (int) frame_count); 1071363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes 1171363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes backtrace_symbol_t* backtrace_symbols = (backtrace_symbol_t*) malloc(sizeof(backtrace_symbol_t) * frame_count); 1271363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes get_backtrace_symbols(frames, frame_count, backtrace_symbols); 1371363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes 1471363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes for (size_t i = 0; i < (size_t) frame_count; ++i) { 1571363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes char line[MAX_BACKTRACE_LINE_LENGTH]; 1671363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes format_backtrace_line(i, &frames[i], &backtrace_symbols[i], 1771363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes line, MAX_BACKTRACE_LINE_LENGTH); 1871363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes fprintf(stderr, " %s\n", line); 1971363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes } 2071363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes 2171363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes free_backtrace_symbols(backtrace_symbols, frame_count); 2271363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes free(backtrace_symbols); 2371363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes free(frames); 2471363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes} 2571363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes 2671363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes__attribute__ ((noinline)) void g() { 2771363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes fprintf(stderr, "g()\n"); 2871363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes do_backtrace(); 2971363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes} 3071363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes 3171363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes__attribute__ ((noinline)) int f(int i) { 3271363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes fprintf(stderr, "f(%i)\n", i); 3371363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes if (i == 0) { 3471363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes g(); 3571363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes return 0; 3671363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes } 3771363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes return f(i - 1); 3871363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes} 3971363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes 4071363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughesint main() { 4171363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes return f(5); 4271363a8075e7916c2166cbdd8a0bf5a180ed4d54Elliott Hughes} 43