我尝试使用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
谢谢你的任何想法, 然
答案 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
存在的相同路径中使用它。