使用GCC編譯的C應(yīng)用程序损拢,如果想在某個(gè)接口中打印調(diào)用棧吼过,可以使用gcc的backtraces特性
Backtraces說(shuō)明中有一個(gè)例子侵续,代碼如下:
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
void *array[10];
char **strings;
int size, i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
if (strings != NULL)
{
printf ("Obtained %d stack frames.\n", size);
for (i = 0; i < size; i++)
printf ("%s\n", strings[i]);
}
free (strings);
}
/* A dummy function to make the backtrace more interesting. */
void
dummy_function (void)
{
print_trace ();
}
int
main (void)
{
dummy_function ();
return 0;
}
直接通過(guò)gcc來(lái)編譯運(yùn)行,結(jié)果如下:
itsenlin@itsenlin-virtual-machine:~/code/test$ gcc -o backtr backtr.c
itsenlin@itsenlin-virtual-machine:~/code/test$ ./backtr
Obtained 6 stack frames.
./backtr(+0x1215) [0x559a1a0b2215]
./backtr(+0x12b1) [0x559a1a0b22b1]
./backtr(+0x12c1) [0x559a1a0b22c1]
/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f779d629d90]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f779d629e40]
./backtr(+0x1125) [0x559a1a0b2125]
itsenlin@itsenlin-virtual-machine:~/code/test$
如果想顯示函數(shù)名,還需要在編譯時(shí)添加-rdynamic
選項(xiàng),如下
itsenlin@itsenlin-virtual-machine:~/code/test$ gcc -o backtr backtr.c -rdynamic
itsenlin@itsenlin-virtual-machine:~/code/test$ ./backtr
Obtained 6 stack frames.
./backtr(print_trace+0x2c) [0x560984d66215]
./backtr(dummy_function+0xd) [0x560984d662b1]
./backtr(main+0xd) [0x560984d662c1]
/lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f860a029d90]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f860a029e40]
./backtr(_start+0x25) [0x560984d66125]
itsenlin@itsenlin-virtual-machine:~/code/test$ vim backtr.c
itsenlin@itsenlin-virtual-machine:~/code/test$