远程 GDB 调试 - 无法访问源文件但未打印错误
Remote GDB debugging - can't acces source file but no errors printed
我正在尝试使用 GDB 命令行远程调试应用程序。
gdb在PC上的路径运行就是应用程序的构建路径。它包含 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.
readelf -WS amixer
的输出中有 .debug*
,因此存在调试符号
list main
没有列出 main 函数的源代码。有点不对劲
show directories
列表 $cdir
和 $cwd
我猜至少其中一个是我开始的目录 gdb amixer
这是包含可执行文件和源代码的构建目录
我显然做错了什么,所以我正在寻找对假设和调试技巧的评论。
break main doesn't throw an error so the executable debug symbols are available.
你错了:break main
没有显示任何错误的事实 不 暗示调试符号可用。其余输出与调试符号一致 not 可用。
所以您的第一步应该是确认调试符号确实存在。如果 readelf -WS amixer
没有显示任何 .debug_*
或 .zdebug_*
部分,这将证明没有调试信息存在。如果是这样,请重新检查您的构建命令行是否存在编译行上的 -g
标志,以及 link 行上是否存在 -Wl,-s
或类似标志。
我正在尝试使用 GDB 命令行远程调试应用程序。
gdb在PC上的路径运行就是应用程序的构建路径。它包含 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.
readelf -WS amixer
的输出中有.debug*
,因此存在调试符号list main
没有列出 main 函数的源代码。有点不对劲show directories
列表$cdir
和$cwd
我猜至少其中一个是我开始的目录gdb amixer
这是包含可执行文件和源代码的构建目录
我显然做错了什么,所以我正在寻找对假设和调试技巧的评论。
break main doesn't throw an error so the executable debug symbols are available.
你错了:break main
没有显示任何错误的事实 不 暗示调试符号可用。其余输出与调试符号一致 not 可用。
所以您的第一步应该是确认调试符号确实存在。如果 readelf -WS amixer
没有显示任何 .debug_*
或 .zdebug_*
部分,这将证明没有调试信息存在。如果是这样,请重新检查您的构建命令行是否存在编译行上的 -g
标志,以及 link 行上是否存在 -Wl,-s
或类似标志。