Tre*_*ntP 5 debugging gdb gdbserver
在使用 gdbserver 进行远程调试时,我想让 gdb 从本地 sysroot 加载正在调试的程序的一些共享库,但也允许从 gdbserver 下载功能加载其他不在 sysroot 中的功能。
gdb 似乎只能使用一种方法来查找库、本地文件或远程下载,而不能同时使用这两种方法。
例如,如果我将 sysroot 设置target:/为使用远程文件,则所有内容都将被下载:
(gdb) set sysroot target:/
(gdb) run
Starting program:
Reading /root/a.out from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /root/a.out from remote target...
Reading symbols from target:/root/a.out...
Reading /lib/ld-linux-armhf.so.3 from remote target...
Run Code Online (Sandbox Code Playgroud)
不幸的是,远程系统上的系统库没有调试符号。它是一个闪存空间有限的嵌入式系统。调试符号会大大增加文件系统的总大小,而且根本不适合。
但是,我有一个所有系统库的本地 sysroot 树,这确实包括调试符号。但是如果我将 sysroot 设置为这棵树,gdb 将不再考虑远程下载。
(gdb) set sysroot /bsp/sysroot
(gdb) run
Starting program:
Reading symbols from /bsp/sysroot/root/a.out...
warning: Could not load shared library symbols for /lib/libm.so.6.
Run Code Online (Sandbox Code Playgroud)
在此示例中,libm.so.6 不在 sysroot 中,但可以从目标下载。但是现在似乎有办法添加target:/回搜索路径。把它放在 solib-search-path 中没有效果。
这种情况源于在嵌入式系统开发中使用板级支持包 (BSP)。BSP 包含许多库,它们在目标上被剥离,因为它们不适合否则,但具有主机的未剥离副本。BSP 的用户构建他们自己的软件,但该软件不是 BSP 的一部分,也不存在于 BSP 的 sysroot 中。但是,它位于目标系统上。
似乎没有办法告诉 gdb 首先尝试在本地查找库,但如果找不到,则回退到远程下载。
GDB 不支持多个系统根目录,但有一些解决方法。
solib_find_1)中的函数处理库查找。目前,它检查(如果以 开头,则使用目标中的库)。否则,它将采用基本名称(即从给定的绝对路径中获取文件名)并在.
为了获得所需的行为,该函数应该回退到不同的目录,例如此补丁: https: //gitlab.com/gbenson/binutils-gdb/commit/0ebe17076406a85a35eb0c4f362850ed9efb843egdb/solib.csysroottarget:solib-search-pathsolib_find_1sshfs),并在需要时使用上一点中的方法回退到目标。set sysroot target:target remote :[your_proxy_port]使用而不是附加调试器target remote :[actual_gdbserver_port],让您的代理代表您连接到 gdbserver。我发现“将目标库复制到主机”变体的组合是最有效的,因为它的要求最低(我只需要一种从目标复制/接收文件的方法):
sysroot 的内容实际上不必与目标的远程文件相同:目标已经剥离了没有调试符号的库,而我在 sysroot 中使用了未剥离的库。
| 归档时间: |
|
| 查看次数: |
2040 次 |
| 最近记录: |