无法使用GDB进行远程调试

时间:2014-05-29 13:29:06

标签: gdb

我尝试使用gdb调试目标,但遭到拒绝。

(gdb)target remote 10.0.0.2:2345 使用10.0.0.2:2345进行远程调试 警告:架构拒绝了目标提供的描述 遥控器'数据包应答过长:00000000ba4eefbe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c04defbe0000000090770940100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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)设置架构i386:x86-64:intel 目标架构假设为i386:x86-64:intel (gdb)target remote 10.0.0.2:2345 使用10.0.0.2:2345进行远程调试 警告:架构拒绝了目标提供的描述 回复包含无效的十六进制数字59

谢谢你的任何想法, 然

4 个答案:

答案 0 :(得分:6)

我使用gdb-multiarch而不是远程机器中的gdb解决了这个问题。

当我使用gdb时出现以下错误:

(gdb)目标远程192.168.1.254:9092
使用192.168.1.254:9092进行远程调试 警告:架构拒绝了目标提供的描述
遥控器'包应答太长:000000002efeffbe34feffbe0000000000000000000000000000000000000000000000000000000000000000000000000000000020fdffbe000000006c1effb6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(GDB)

我的远程计算机是32位Intel Ubuntu V 16.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)目标远程192.168.1.254:9092

该IP地址是我的目标机器之一;

在第6步之后,我得到了以下屏幕(而不是错误),调试运行良好:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我刚配置了我的窗口,现在我可以从我的Windows机器远程调试到Linux二进制文件。 确保您的GDB使用主机中的正确选项进行编译(在我的情况下是Windows机器)。一个例子:

  

./ gdb-7.4 / configure --with-expat --target = x86_64-unknown-linux-gnu   主机= i686的-PC-的mingw32

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

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

- tagret选项值应该与目标的gdb banner相同。转到目标机器(在我的情况下为linux)并输入gdb,你会看到像x86_64-unknown-linux-gnu这样的东西,你应该输入这个值。

- 主机选项应该是i686-pc-mingw32,如果你在Windows上并使用mingw。

我希望它有所帮助。

答案 3 :(得分:0)

这意味着您在本地计算机上调用的gdb和在远程计算机上调用的gdbserver具有不同的体系结构,这也意味着您编译的应用程序将是cross-compiled且带有编译器受您的远程计算机支持。因此,在本地计算机上,您应该调用远程计算机支持的gdb。很有可能在您的cross compiler存在的相同路径中使用它。