Commit a1b37d0f37a8941ce78ead019d974c6e75c61be1

Authored by 김태훈
1 parent c35246804f
Exists in master

assert에 backtrace 추가

원본: https://github.com/mct/junkdrawer/blob/master/c/assert-backtrace.c
Showing 1 changed file with 66 additions and 0 deletions   Show diff stats
c/assert-backtrace.c
@@ -0,0 +1,66 @@ @@ -0,0 +1,66 @@
  1 +// vim:set ts=4 sw=4 ai et:
  2 +#include <stdio.h>
  3 +#include <execinfo.h>
  4 +#include <signal.h>
  5 +#include <stdlib.h>
  6 +#include <unistd.h>
  7 +#include <assert.h>
  8 +/*
  9 +
  10 +Compile with "-rdynamic" to include function names in the backtrace output
  11 +
  12 +Example output:
  13 +
  14 +$ gcc -rdynamic -Werror assert-backtrace.c && ./a.out
  15 +Backtrace:
  16 +
  17 + 1 a.out(quux+0x9) [0x55d540c74cd4]
  18 + 2 a.out(qux+0xe) [0x55d540c74d08]
  19 + 3 a.out(baz+0xe) [0x55d540c74d19]
  20 + 4 a.out(bar+0xe) [0x55d540c74d2a]
  21 + 5 a.out(foo+0xe) [0x55d540c74d3b]
  22 + 6 a.out(main+0x19) [0x55d540c74d57]
  23 + 7 /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7) [0x7fdc6b424b97]
  24 + 8 a.out(_start+0x2a) [0x55d540c74a5a]
  25 +
  26 +a.out: assert-backtrace.c:57: quux: Assertion `0 && "test assertion" || printbt()' failed.
  27 +Aborted (core dumped)
  28 +
  29 +*/
  30 +
  31 +#define assert_bt(...) assert(__VA_ARGS__ || printbt())
  32 +#define STACK_DEPTH 20
  33 +int printbt(void)
  34 +{
  35 + void *buffer[STACK_DEPTH];
  36 + char **strings;
  37 + int size, i;
  38 +
  39 + size = backtrace(buffer, STACK_DEPTH);
  40 + strings = backtrace_symbols(buffer, size);
  41 +
  42 + fprintf(stderr, "Backtrace:\n\n");
  43 +
  44 + for (i = 1; i < size; i++) {
  45 + if (strings[i][0] == '.' && strings[i][1] == '/')
  46 + strings[i] += 2;
  47 +
  48 + fprintf(stderr, " %3d %s\n", i, strings[i]);
  49 + }
  50 +
  51 + fprintf(stderr, "\n");
  52 +
  53 + return 0;
  54 +}
  55 +
  56 +void quux() { assert_bt(0 && "test assertion"); }
  57 +void qux() { quux(); }
  58 +void baz() { qux(); }
  59 +void bar() { baz(); }
  60 +void foo() { bar(); }
  61 +
  62 +int main(int argc, char **argv)
  63 +{
  64 + foo();
  65 + return 0;
  66 +}