获取调用栈优化

最早,libc中backtrace函数,功能正确无误,但是性能差。

 

其次,遍历栈帧,rbp寄存器充当链表next指针作用;另外,返回地址在栈帧最后,所以rbp+8就能找到调用者返回地址;这样递归可以得到调用栈;

PS:rbp值是一直增长变大的,因为回溯调用栈,找前面调用者,就是栈回溯,而调用栈是从高地址往低地址发展的;

出现问题:1,堆栈不完整;2,出现unknow(错误的调用栈)

 

再次,用gcc内置__builtin_frame_address充当rbp的next作用,__builtin_return_address获取返回地址,调通不崩溃后,发现效果和上面一样;

 

最后,bing查找:

X86-64寄存器和栈帧

也就是%ebp中再也不是保存帧指针

得到原因了

 

开启优化选项“-O1”以上,rbp和ebp就再也不保存frame_address了,而是另做它用;

栈帧长度,在gcc编译器预先计算好了;

 

posted @ 2021-10-13 10:43  醉卧古藤下  阅读(84)  评论(0编辑  收藏  举报