远程GDB调试 - 无法访问源文件但未打印错误

时间:2015-07-17 11:38:54

标签: debugging gdb embedded-linux remote-debugging gdbserver

我正在尝试使用GDB命令行远程调试应用程序。 在PC上运行gdb的路径是应用程序的构建路径。它包含amixer可执行文件和amixer.c

代码使用-g -O2参数进行编译。

调试符号似乎存在:

$ readelf -WS amixer
There are 38 section headers, starting at offset 0x1d24c:
...
  [27] .debug_aranges    PROGBITS        00000000 00a758 000140 00      0   0  8
  [28] .debug_info       PROGBITS        00000000 00a898 008c59 00      0   0  1
  [29] .debug_abbrev     PROGBITS        00000000 0134f1 00085a 00      0   0  1
  [30] .debug_line       PROGBITS        00000000 013d4b 001a8c 00      0   0  1
  [31] .debug_frame      PROGBITS        00000000 0157d8 000494 00      0   0  4
  [32] .debug_str        PROGBITS        00000000 015c6c 001f75 01  MS  0   0  1
  [33] .debug_loc        PROGBITS        00000000 017be1 004dff 00      0   0  1
  [34] .debug_ranges     PROGBITS        00000000 01c9e0 000700 00      0   0  1

远程设备上的步骤(剥离的二进制文件):

gdbserver 192.16.6.21:12345 amixer

PC上的步骤(这里没有剥离二进制):

$ gdb amixer
(gdb) set sysroot /correct/path/to/remote/device/sysroot
(gdb) target remote 192.16.6.12:12345
(gdb) break main 
Breakpoint 1 at 0x11f58
(gdb) list main   
(gdb) show directories 
Source directories searched: $cdir:$cwd
(gdb) continues
...program executes on remote device... 

我做出的假设:

  • break main不会抛出错误,因此可执行的调试符号可用。我希望看到这里提到的源文件。与example中一样:Breakpoint 1 at 0x62f4: file builtin.c, line 879.
  • .debug*的输出中有readelf -WS amixer,因此调试符号存在
  • list main未列出主要功能的来源。有些事情不对

  • show directories列表$cdir$cwd我猜他们至少是我开始gdb amixer的目录,那就是使用可执行文件和源构建目录

我显然做错了所以我正在寻找对假设和调试技巧的评论。

1 个答案:

答案 0 :(得分:1)

  

break main不会抛出错误,因此可执行的调试符号可用。

你错了:break main没有显示任何错误的事实意味着调试符号可用。输出的其余部分与调试符号 不可用一致。

因此,您的第一步应该是确认调试符号实际存在。如果readelf -WS amixer未显示任何.debug_*.zdebug_*部分,则可以证明不存在调试信息。如果是这样,请重新检查构建命令行是否在编译行上存在-g标志,并且在链接行上没有-Wl,-s或类似的标记。