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;
}