0
点赞
收藏
分享

微信扫一扫

Linux打印函数调用栈

jjt二向箔 2022-01-27 阅读 79
linux

这里写自定义目录标题

Linux打印函数调用栈

引用

头文件

#include <execinfo.h>

函数

int depth = backtrace(buffer, MAX_DEPTH);
获取调用栈深度

char ** func_names = backtrace_symbols(buffer, depth);
获取每个栈的函数名称

实例

#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] 
举报

相关推荐

0 条评论