bracetrace 实现

1、不同平台ebp、eip会有不一样的规则
2、32位和64位不同的指针大小所以建议使用size_t
3、如果真的不知道ebp和eip的规则,直接打印p到p+64,和对应的p,观察p和p,一般就能发现规则。使用gdb可以直接打印堆栈获取函数执行顺序,比较gdb和自己分析的一不一样。
4、参考《系统程序员成长计划》
单线程测试可行,多线程会有问题

size_t backtrace2(void **buffer, size_t size)
{
	size_t n = 0xfefefef1;
	size_t *p = &n;
	int i = 0;
 
#if allwinner_r7
	size_t ebp = p[5];
	size_t eip = p[6];

	for(i=0; i < size; i++){
		buffer[i] = (void *)eip;
		p = ((size_t *)ebp)-1;
		printf("bt=%p\r\n", p);	// r7 平台上如果不打印p就会报错,不知道为什么
		if(p)
		{
			ebp = p[0];
			eip = p[1];
		}
		else
		{
			break;
		}
	}
#else							// 默认Ubuntu 16.04.6 LTS
	size_t ebp = p[5];
	size_t eip = p[6];

	for(i=0; i<size; i++){
		buffer[i] = (void *)eip;
		p = (size_t *)ebp;
		ebp = p[0];
		eip = p[1];
	}
#endif
	return size;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值