Linux打印函数调用栈

这里写自定义目录标题

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] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值