无法使用GDB进行远程调试

10

我正在尝试使用gdb调试目标,但遇到拒绝。

(gdb) target remote 10.0.0.2:2345 使用 10.0.0.2:2345 进行远程调试 警告:架构拒绝了目标提供的描述 远程'g'数据包的回复太长:00000000ba4eefbe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c04defbe(后略)

PC是64位体系结构,Ubuntu 64位。

$ uname -a Linux ubuntu-VirtualBox 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

尝试设置不同的体系结构没有帮助。 (gdb) set architecture i386:x86-64:intel 假定目标体系结构为i386:x86-64:intel (gdb) target remote 10.0.0.2:2345 使用 10.0.0.2:2345 进行远程调试 警告:架构拒绝了目标提供的描述 回复包含无效十六进制数字59

感谢任何帮助, Ran


有人有什么想法吗? - ransh
你是如何启动 gdb 的? - Michael Foukarakis
4个回答

7
我在远程机器上使用gdb-multiarch而不是仅使用gdb来解决了这个问题。
当我使用gdb时,我遇到了以下错误:
(gdb) target remote 192.168.1.254:9092 Remote debugging using 192.168.1.254:9092 warning: Architecture rejected target-supplied description Remote 'g' packet reply is too long: ...
我的远程机器是32位英特尔Ubuntu V16.04,目标机器是ARM 32位Linux。
我按照以下步骤进行操作:
1:在远程和目标机器上保持相同的二进制可执行文件(编译为目标机器并带有Debug选项,在GCC中只需使用“-g”选项);
2:在目标机器上安装gdbserver: $ sudo apt install gdbserver 3:在远程机器上安装gdb-multiarch: $ sudo apt install gdb-multiarch
4:在目标机器上启动gdbserver: $ gdbserver localhost:9092 app 其中9092是我选择的端口号,app是二进制可执行文件的名称;
5:在远程机器上启动gdb-multiarch: $ gdb-multiarch app 6:输入gbd-multiarch命令:
(gdb) target remote 192.168.1.254:9092
其中IP地址是我的目标机器的地址;
完成第6步后,我得到了以下屏幕(而不是错误),调试工作正常:

(gdb) target remote 192.168.1.254:9092
使用 192.168.1.254:9092 进行远程调试
正在从远程目标读取 /lib/ld-uClibc.so.0 ...
警告:来自远程目标的文件传输可能很慢。可以使用 "set sysroot" 来本地访问文件。
正在从远程目标读取 /lib/ld-uClibc.so.0 ...
正在从目标:/lib/ld-uClibc.so.0 中读取符号...(未找到调试符号)...完成。
0xb6ff1e6c 在目标:/lib/ld-uClibc.so.0 中的 _start () 函数中。
(gdb)


2
Felipe,你的回答因为太短而被自动标记为低质量。你能否编辑一下,解释一下gdb-multiarch是什么以及它如何帮助,也许还可以提供一个链接? - JasonB

3

我遇到了类似的问题,正在从openSUSE 13.1 i64上的ARM CortexA5调试代码。当我在目标设备上调用gdbserver和在笔记本电脑上调用gdb时,出现了问题,但是在笔记本电脑上调用gdb并没有指向交叉编译的二进制文件,而是指向了为笔记本电脑编译的二进制文件(因此是i64)。

在将笔记本电脑上的gdb指向与在目标设备上使用gdbserver启动的交叉编译的相同二进制文件之后,一切都正常了,错误消息消失了。


2
这意味着你在本地机器上调用的gdb和在远程机器上调用的gdbserver是不同架构的,这也意味着你编译的应用程序将被交叉编译,使用远程机器支持的编译器。因此,在本地机器上,你应该调用远程机器支持的gdb。很可能它会在与你的交叉编译器相同的路径中可用。

0

我刚刚配置好了我的Windows系统,现在我可以从我的Windows机器远程调试到一个Linux二进制文件。

请确保您的GDB在主机机器(在我的情况下是Windows机器)上编译了正确的选项。以下是一个示例:

./gdb-7.4/configure --with-expat --target=x86_64-unknown-linux-gnu --host=i686-pc-mingw32

如果您没有安装expat,请下载并安装它。

您应该下载gdb源代码。在同一文件夹中,您应该运行configure。

--target选项值应与目标的gdb横幅相同。转到目标机器(在我的情况下是Linux)并键入gdb,您将看到类似于x86_64-unknown-linux-gnu的内容,您应该输入此值。

如果您正在Windows上使用mingw,则--host选项应为i686-pc-mingw32。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接