GDB不显示函数名称

时间:2011-12-05 19:44:13

标签: c++ gdb segmentation-fault

我正在使用gdbserver从嵌入式设备进行调试:

./gdbserver HOST:5000 /home/test_app

在我的电脑中,我以这种方式执行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来说是全新的)

3 个答案:

答案 0 :(得分:15)

好的,如果缺少调试符号,通常会发生这种情况......只是为了确保运行以下命令

file <your_executable>

你将获得二进制信息,如格式,arch等。信息的最后部分描述二进制文件是否被剥离。对于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都具有相同的版本。

arm-none-linux-gnueabi-gdb --version
./gdbserver --version

如果上述所有情况都属实,并且您仍然没有得到回溯,那么您的堆栈就会出现问题。尝试在代码/新添加的代码上运行一些静态分析,valgrind。

答案 1 :(得分:5)

您需要在启用调试符号的情况下构建应用程序。 gcc的开关是-g

答案 2 :(得分:0)

每个翻译单元都需要包含-g,例如,如果有许多目标文件链接在一起以构建最终的可执行文件,则每次编译都需要包含-g命令。

g++ -g file1.cpp -c -o file1.o
g++ -g file2.cpp -c -o file2.o
...
g++ -g file1.o file2.o -o main