glibcのbacktraceとbacktrace_symbol_fdを使って、
Cプログラムのbacktraceを表示出来ます。
GNUの解説
http://www.gnu.org/software/libc/manual/html_node/Backtraces.html
backtrace
#include <execinfo.h>
void foo()
{
void *trace[128];
int n = backtrace(trace, sizeof(trace)/sizeof(trace[0]));
backtrace_symbols_fd(trace, n, 1);
}
int main(void){
foo();
return 0;
}
gcc -g -rdynamic
で、コンパイル後、実行させると、下記のようにバックトレースをゲットできる。
関数fooがコールされるまでの関数コールをゲット。
./a.out(foo+0x1f)[0x8048603]
./a.out(main+0xb)[0x8048630]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x4c4f84d3]
./a.out[0x8048551]