我正在尝试在ARM上使用gdbserver调试软件,以获取崩溃的回溯信息。不幸的是,我只得到问号。在任何地方,我读到的这个问题都与缺少符号有关,但是没有从我的库中删除符号。
如果我尝试使用file命令在客户端中加载符号,则会得到:
reading symbols from <path>/libQtWebKit.so.4.7.2...(no debugging symbols found)...done.
然后,当发生崩溃时:
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) bt
#0 0x00000000 in ?? ()
#1 0x4bf38b88 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
我的库是在发行版中编译的,但符号实际上已经存在。使用nm我可以找到那些。为什么我只收到问号?这仅仅是因为库是经过优化编译的吗?在 Release模式下用库进行调试是不可能的吗?
最佳答案
corrupt stack
注释可能是您的问题。它看起来像一个返回地址或虚拟表条目,或者某些东西被零覆盖,然后将控制权转移到那里。即使您有可用的符号,这些地址也不会指向有效的符号。因此,segfault。
我不羡慕你的任务。这些是最难追踪的错误,当您更改代码以 try catch 它们时,它们甚至可能移动或暂时消失。最好的选择通常是使用git bisect
或与VCS类似的东西来查找引入它的提交。希望它复制不是太困难。
关于c++ - gdb在ARM上报告的backtrace中的仅问号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8437526/