返回知识列表:
/**********************************************
* a demo for backtrace to print the calling flow.
* Author: Ricardo.Yu
* Date: 2020=08-25
**********************************************/
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#define BT_MAX_TRACE 100
void print_trace (const char* func_name)
{
void *array[BT_MAX_TRACE];
size_t size = 0, i = 0;
char **strings = NULL;
printf("backtrace for %s start.\n", func_name);
size = backtrace (array, BT_MAX_TRACE);
strings = backtrace_symbols (array, size);
if( NULL == strings){
printf("backtrace_sysmbols is null.\n");
return;
}
printf ("Obtained %zd stack frames.\n", size);
for (i = 0; i < size; i++){
printf ("%s\n", strings[i]);
}
free (strings); //glibc 中标准例子。
strings = NULL;
}
void dummy_function (void)
{
print_trace (__func__);
}
void test1()
{
dummy_function();
}
void test2()
{
test1();
}
int main (void)
{
test2();
return 0;
}
编译成可执行文件,执行即可看出效果:gcc -g -rdynamic -o backtrace backtrace.c 编译的时候要带debug 信息,否则打印出来的只有地址,也就没什么意义了。
# ./bt
Obtained 7 stack frames.
./bt(print_trace+0x1f) [0x80487b3]
./bt(dummy_function+0xb) [0x8048822]
./bt(test1+0xb) [0x804882f]
./bt(test2+0xb) [0x804883c]
./bt(main+0xb) [0x8048849]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x17fbd6]
./bt() [0x8048701]
本文介绍了一种在Linux环境下打印当前函数调用栈的方法,通过使用execinfo.h库中的backtrace函数,可以获取到调用流程的详细信息。文章提供了一个示例代码,展示了如何在函数中调用print_trace来打印调用栈,并通过gcc编译器的-g和-rdynamic选项确保可执行文件包含调试信息。
7174

被折叠的 条评论
为什么被折叠?



