这里写自定义目录标题
Linux打印函数调用栈
头文件
#include <execinfo.h>
函数
int depth = backtrace(buffer, MAX_DEPTH);
获取调用栈深度
char ** func_names = backtrace_symbols(buffer, depth);
获取每个栈的函数名称
内核函数:
dump_stack()
实例
#include <stdio.h>
#include <execinfo.h>
#define MAX_DEPTH 20
void PrintfStackFunName(void)
{
void *buff[MAX_DEPTH] = { 0 };
unsigned int depth = backtrace(buff, MAX_DEPTH);
char **funName = backtrace_symbols(buff, depth);
for (int i = 0; i < MAX_DEPTH; i++) {
if (i >= depth) {
break;
}
printf("i = %d, func = %s\n", i, funName[i]);
}
}
void func4(void)
{
printf("%s [line] = %d\n", __FUNCTION__, __LINE__);
PrintfStackFunName();
}
void func3(void)
{
printf("%s [line] = %d\n", __FUNCTION__, __LINE__);
func4();
}
void func2(void)
{
printf("%s [line] = %d\n", __FUNCTION__, __LINE__);
func3();
}
void func1(void)
{
printf("%s [line] = %d\n", __FUNCTION__, __LINE__);
func2();
}
int main(void)
{
func1();
return 0;
}
编译:
gcc backtrace.c -std=c99 -rdynamic
运行效果:
func1 [line] = 39
func2 [line] = 33
func3 [line] = 27
func4 [line] = 21
i = 0, func = ./a.out(PrintfStackFunName+0x2b) [0x80486cb]
i = 1, func = ./a.out(func4+0x22) [0x804874b]
i = 2, func = ./a.out(func3+0x22) [0x804876f]
i = 3, func = ./a.out(func2+0x22) [0x8048793]
i = 4, func = ./a.out(func1+0x22) [0x80487b7]
i = 5, func = ./a.out(main+0x21) [0x80487da]
i = 6, func = /lib/tls/libc.so.6(__libc_start_main+0xe3) [0x31ae33]
i = 7, func = ./a.out [0x8048619]