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