blob: 2d1ba7cc94c0f83543b2e0bae10bebdbf01ce6d8 [file] [log] [blame]
Elliott Hughes71363a82012-05-18 11:56:17 -07001#include <corkscrew/backtrace.h>
2#include <stdio.h>
3#include <stdlib.h>
4
5void do_backtrace() {
6 const size_t MAX_DEPTH = 32;
7 backtrace_frame_t* frames = (backtrace_frame_t*) malloc(sizeof(backtrace_frame_t) * MAX_DEPTH);
8 ssize_t frame_count = unwind_backtrace(frames, 0, MAX_DEPTH);
9 fprintf(stderr, "frame_count=%d\n", (int) frame_count);
10
11 backtrace_symbol_t* backtrace_symbols = (backtrace_symbol_t*) malloc(sizeof(backtrace_symbol_t) * frame_count);
12 get_backtrace_symbols(frames, frame_count, backtrace_symbols);
13
14 for (size_t i = 0; i < (size_t) frame_count; ++i) {
15 char line[MAX_BACKTRACE_LINE_LENGTH];
16 format_backtrace_line(i, &frames[i], &backtrace_symbols[i],
17 line, MAX_BACKTRACE_LINE_LENGTH);
18 fprintf(stderr, " %s\n", line);
19 }
20
21 free_backtrace_symbols(backtrace_symbols, frame_count);
22 free(backtrace_symbols);
23 free(frames);
24}
25
26__attribute__ ((noinline)) void g() {
27 fprintf(stderr, "g()\n");
28 do_backtrace();
29}
30
31__attribute__ ((noinline)) int f(int i) {
32 fprintf(stderr, "f(%i)\n", i);
33 if (i == 0) {
34 g();
35 return 0;
36 }
37 return f(i - 1);
38}
39
40int main() {
41 return f(5);
42}