#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf ("Obtained %zd stack frames.
", size);
for (i = 0; i < size; i++)
printf ("%s
", strings[i]);
free (strings);
}
/* A dummy function to make the backtrace more interesting. */
void dummy_function(void);
void test(void){
dummy_function();
}
void test1(void){
test();
printf("ok");
}
void
dummy_function (void)
{
//test();
print_trace ();
}
int
main (void)
{
//dummy_function ();
test1();
//print_trace();
return 0;
}
输出:
Obtained 7 stack frames.
./test(print_trace+0x14) [0x804878c]
./test(dummy_function+0xb) [0x8048837]
./test(test+0xb) [0x804880d]
./test(test1+0xb) [0x804881a]
./test(main+0x15) [0x804884e]
/lib/i686/libc.so.6(__libc_start_main+0xc7) [0x4003eb77]
./test(backtrace_symbols+0x31) [0x80486ed]
color=red>我理解这个函数只能取得直接调用的轨迹。而无法得到下面这样代码的调用轨迹color=red>
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
void *array[10];
size_t size;
char **strings;
size_t i;
size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf ("Obtained %zd stack frames.
", size);
for (i = 0; i < size; i++)
printf ("%s
", strings[i]);
free (strings);
}
/* A dummy function to make the backtrace more interesting. */
void dummy_function(void);
void test(void){
//dummy_function();
}
void test1(void){
test();
printf("ok");
}
void
dummy_function (void)
{
test();
print_trace ();
}
int
main (void)
{
dummy_function ();
test1();
//print_trace();
return 0;
}
输出:
Obtained 5 stack frames.
./test(print_trace+0x14) [0x804878c]
./test(dummy_function+0x10) [0x8048834]
./test(main+0x15) [0x804884b]
/lib/i686/libc.so.6(__libc_start_main+0xc7) [0x4003eb77]
./test(backtrace_symbols+0x31) [0x80486ed]
没有得到test调用信息