如何在ARM平台生成可用调用栈?解决外部库调用栈丢失问题
ARM平台(树莓派)外部库调试调用栈丢失问题
我在ARM平台(树莓派,使用g++ (Raspbian 8.3.0-6+rpi1) 8.3.0版本)开发C++应用时遇到以下问题:
- 调试自身代码或代码崩溃时,能正常获取完整且正确的调用栈;
- 但当应用在外部库中崩溃,或使用GDB单步进入外部库函数后,调用栈会丢失,仅保留当前函数的调用信息。
示例场景
初始断点状态
在memcpy函数开头设置断点后,调用栈正常:
(gdb) bt #0 0x76fa4b5c in memcpy () at /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so #1 0x000e6118 in CWatchDog::ComputeBatteryPercentage(float) (this=0x2643140, voltage=3.96600008) at WatchDog.cpp:197 #2 0x000e5c24 in CWatchDog::BatteryControl(CWatchDog::RxPacketData const&) (this=0x2643140, data=...) at WatchDog.cpp:149 ... etc ...
单步执行后状态
单步执行几条指令(经过vpush指令)后,调用栈丢失上层信息:
(gdb) bt #0 0x76fa4b60 in memcpy () at /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so #1 0x00000000 in ()
我已经尝试过使用-funwind-tables、-fasynchronous-unwind-tables、-mapcs-frame这些编译选项重新编译代码,但没有解决问题。请问是否有办法在外部函数调试时保留完整调用栈?
内容的提问来源于stack exchange,提问作者bigmuscle
相关产品推荐
相关产品推荐

