While porting some software from Windows to Linux, I needed to see backtraces. If there is no global exception handler and an exception in C++ is not caught, it aborts the program. The reports I got went along the lines of some program output:
$ run_foo Aborted.
Not very helpful!
So I wrote a small pair of trace macros based on the GNU C Library's backtrace
facility. Although this facility is only available for UNIX and Linux platforms, my tracing macros still are helpful under Windows sans backtracing.
#ifndef TRACE_H_ #define TRACE_H_ #include <stdio.h> #include <stdlib.h> #define TRACE_BACKTRACE_FRAMES 10 #ifdef __GNUC__ # define __FUNCTION__ __PRETTY_FUNCTION__ #endif /* Emacs-style output */ #ifdef EMACS # define TRACE_PREFIX fprintf (stderr, "%s:%d:%s", __FILE__, __LINE__, __FUNCTION__) #else # define TRACE_PREFIX fprintf (stderr, "%s(%d):%s", __FILE__, __LINE__, __FUNCTION__) #endif /* EMACS */ #ifdef linux # include <execinfo.h> # define TRACE_DUMP() do { void *array[TRACE_BACKTRACE_FRAMES]; int n = backtrace (array, sizeof (array) / sizeof (void *)); char **symbols = backtrace_symbols (array, n); int i; for (i = 0; i < n; ++i) fprintf (stderr, " -[%d]%s\n", i, symbols[i]); free (symbols); } while (0) #else # define TRACE_DUMP() #endif /* linux */ #define TRACE() TRACE_PREFIX; fprintf (stderr, "\n"); TRACE_DUMP () #define TRACE_MSG(MSG) TRACE_PREFIX; fprintf (stderr, ": %s\n", MSG); TRACE_DUMP () #endif /* TRACE_H_ */
Use the EMACS
define to switch between Emacs-style and regular line tracing.
UPDATE: I meant to provide sample output:
trace.c(9):bob: Some interesting debug message. -[0]./trace(bob+0x51) [0x804878d] -[1]./trace(main+0x21) [0x8048817] -[2]/lib/tls/libc.so.6(__libc_start_main+0xd0) [0x4021de80] -[3]./trace [0x80486a1]
One thing jumps out immediately: this is not Java. But one can tease out that main
called bob
and bob
wrote a trace message. Notice this:
trace.c(9):bob: Some interesting debug message. -[0]./trace(main+0x51) [0x8048841] -[1]/lib/tls/libc.so.6(__libc_start_main+0xd0) [0x4021de80] -[2]./trace [0x80486a1]
That is the same output with -O3
passed to GCC. The compiler inlines away the trivial bob
function. -O2
did not inline the function.
No comments:
Post a Comment