我正在使用gdbserver从嵌入式设备进行调试:
./gdbserver HOST:5000 /home/test_app
在我的PC中,我以这种方式执行gdb:
arm-none-linux-gnueabi-gdb test_app
一旦应用程序执行完毕,我将收到我想调试的Segfault,但是不可能知道是哪一行产生的:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 715]
0x31303030 in ?? ()
(gdb) bt
#0 0x31303030 in ?? ()
#1 0x0000dff8 in ?? ()
#2 0x0000dff8 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(我必须说我对GDB完全陌生)
最佳答案
好的,如果缺少调试符号,通常会发生这种情况...只是为了确保按照以下命令运行
file <your_executable>
您将获得有关二进制文件的信息,例如格式,拱门等。信息的最后部分描述了二进制文件是否已剥离。为了在GDB中进行调试,不应删除二进制文件。
nm --debug-sym <your_executable> | grep debug
如果您有一些有效的打印件,如下所示,则表明存在调试符号。
00000000 N .debug_abbrev
00000000 N .debug_aranges
00000000 N .debug_frame
00000000 N .debug_info
00000000 N .debug_line
00000000 N .debug_loc
00000000 N .debug_pubnames
00000000 N .debug_str
此外,当您调用GDB时,您应该有以下一行
Reading symbols from <your_executable>...done.
此时,您应该可以使用
list
命令列出源。确保gdb和gdbserver具有相同的versioninig。
arm-none-linux-gnueabi-gdb --version
./gdbserver --version
如果以上所有都是正确的,并且您仍然没有回溯,则说明堆栈发生了一些问题。尝试在您的代码/新添加的代码上运行一些静态分析valgrind。
关于c++ - GDB不显示函数名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8390881/