2011-12-05 51 views
8

我从嵌入式设备使用gdbserver的调试:GDB不显示函数名

./gdbserver HOST:5000 /home/test_app 

在我的电脑,我用这种方式执行GDB:

arm-none-linux-gnueabi-gdb test_app 

一旦应用程序执行,我收到我要调试的内存设计缺陷,但它是不可能知道什么线生产出来:

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?) 

(我必须说,我totall y新的GDB)

+1

你用什么标志编译? GDB知道从哪里获取源文件,以便它可以显示停止的行吗? –

+1

我不明白。你的电脑是ARM?而且你根本没有连接到GDB服务器。 –

+1

请问您可以发布您的编译器执行线和完整的GDB命令吗?我同意Tomalak Geret'kal的看法,这里肯定缺少一些东西,至少连接到GDB服务器和设置源目录的命令。 – thiton

回答

10

确定,如果调试符号缺少这通常发生...只是为了确保运行以下命令

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你应该follwing线

Reading symbols from <your_executable>...done. 

此时,你应该能够列出源与list命令。

确保gdb和gdbserver具有相同的版本号。

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

如果以上属实,你仍然没有得到回溯,有什么不与你的堆栈回事。尝试运行一些静态分析,在您的代码/新添加的代码上使用valgrind。

+0

感谢您的信息!恐怕我剥了它... – funkadelic

+0

我不认为这个答案是真的。我发现了几个带有可见功能名称的剥离文件(但没有源文件可重现) – Blauhirn

5

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

+0

这绝对是一个方面,但有更多与gdbserver交叉调试。 OP还没有发布足够的信息来回答这个问题。 – thiton

+0

我现在无法发布我使用的完整编译选项,但是我使用了-g。 – funkadelic