gdbserver:映射共享库部分时出错

gdbserver: Error while mapping shared library section

我在使用 gdbserver 时遇到调试问题。 gdb 显示加载共享库之一时出错。

Error while mapping shared library sections:
`target:<path to library>': not in executable format: Invalid argument

我在使用 PID 与 gdb 连接时没有问题。但是 gdbserver 抛出上述错误,然后我无法在该共享库中设置任何断点。

知道哪里出了问题吗?我有来自同一应用程序的其他库,它们似乎没有任何问题。

我 运行 在

Centos 6.7
gdb version 7.11.1
gcc version 4.4.7

我发现 gdb 版本 7.10+ 对我的特定二进制文件有这个问题。仍然不确定为什么。这适用于 7.9,所以我降级以解决这个问题。

我在 GDB 7.11(Android 的 NDK-r20 附带的那个)中遇到了这个错误,这是由于我的库相对较大 (300MB) 引起的,它触发了 gdbserver 的整数解析器阻止 gdbserver 加载任何大于 268MB 的库。通过将限制提高到 2GB (https://sourceware.org/bugzilla/show_bug.cgi?id=23198),该错误在 GDB 8.2 中得到修复。

我使用 GDB 的 sysroot 功能解决了这个问题:https://sourceware.org/gdb/current/onlinedocs/gdb/Files.html#index-set-sysroot
我将库从远程目标复制到我的本地系统*并使用 set sysroot sysroot-here(其中 "sysroot-here" 是包含我复制的 directories/files 的目录)。这会强制 GDB 在本地而不是从目标读取符号。

通过这种 sysroot 方法,我不仅解决了这个错误,而且还能够使用带有完整调试符号的库(大约 3GB,这可能也会触发较新的 GDB 版本) .

* 我复制了所有系统库和应用程序库,同时保留了完整的目录结构/文件路径。我只想复制触发该错误的特定库,但对于 sysroot 来说,它是全有或全无:要么在主机本地找到所有库,要么 none。另见: