Linux GDB的远程调试错误

Linux GDB的远程调试错误,linux,debugging,gdb,virtual-machine,Linux,Debugging,Gdb,Virtual Machine,我试图在x86_64 suse linux上远程调试一个32位应用程序,但出现了这个“远程寄存器格式错误”错误 我在端口12345上启动gdbserver作为侦听(gdbserver localhost:12345 my_prog) 这就是错误: $ gdb GNU gdb 6.6 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public Li

我试图在x86_64 suse linux上远程调试一个32位应用程序,但出现了这个“远程寄存器格式错误”错误

我在端口12345上启动gdbserver作为侦听(gdbserver localhost:12345 my_prog)

这就是错误:

$ gdb
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
(gdb) target remote <ip>:12345
Remote debugging using <ip>:12345
Remote register badly formatted: T0506:0000000000000000;07:80b8bcff00000000;10:4028f0f700000000;
here: 0000000;07:80b8bcff00000000;10:4028f0f700000000;
(gdb)
$gdb
GNU gdb 6.6
版权所有(C)2006免费软件基金会。
GDB是自由软件,受GNU通用公共许可证的保护,您是
欢迎在特定条件下更改和/或分发副本。
键入“显示复制”以查看条件。
GDB绝对没有保修。有关详细信息,请键入“显示保修”。
此GDB配置为“x86_64-suse-linux”。
(gdb)远程目标:12345
使用:12345进行远程调试
远程寄存器格式错误:T0506:0000000000000000;07:80B8BCFF0000000;10:4028F0F700000;
此处:0000000;07:80B8BCFF0000000;10:4028F0F700000;
(gdb)
这是调试服务器计算机(uname-a):

Linux服务器2.6.16.60-0.31-smp#1 smp周二10月7日16:16:29 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

这是调试客户机(uname-a):

Linux客户端2.6.16.54-0.2.5-default#1周一1月21日13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

但这两台机器都在虚拟机(VMWare)中运行。gdbserver二进制文件从客户端计算机复制到服务器计算机

(我远程调试,因为调试服务器上的运行时环境类似于生产环境,并且不包含任何开发工具、对源代码的访问等。)

欢迎提出任何建议

更新:通过在gdb中发出以下命令,这对我有效:


设置体系结构i386:x86-64

也许您需要在
(gdb)
提示符下执行类似
设置体系结构i386
的操作?连接到远程目标后,
显示架构
会说些什么?

可能您已经检查过了,但下面是: -在64位机器上,是否有32位的库(libc等)?
-您是否尝试过使用“-nx”(无初始化文件)开关运行gdb?

64位gdb可以直接调试32位和64位低级进程(我相信这就是所谓的多级支持)

gdbserver的情况并非如此:它不支持多通道调试

您需要匹配目标体系结构的
gdbserver
,以及匹配
gdbserver
gdb
。从源代码构建它们,用
--target=i686

1)配置您的目标机器和主机需要一个合适的gdbserver(适合您的情况的目标机器)

假设我想从x86主机调试ppc目标:

我需要在我的目标上安装一个ppc可执行gdbserver

我需要在主机上安装一个用于powerpc的x86可执行gdb

设置好这些内容后,如果使用共享LIB,在连接到目标之前,必须从主机gdb执行以下操作:

设置solib绝对前缀$ELDK_prefix/ELDK-4.2-ppc_4xx/$CROSS_COMPILE

目录$ELDK_前缀/ELDK-4.2-ppc_4xx/$CROSS_编译


否则,主机gdb将疯狂地尝试加载x86的共享库。

我认为您需要在主机上使用目标程序的副本运行gdb。也就是说,如果您在目标机器上运行
gdbserver myprog
,您需要将
myprog
复制到主机上并运行
gdb myprog


这样,主机上的gdb将自动从可执行文件中提取架构。在主机上这样运行gdb也将加载符号,如果没有这些符号,您将得到无法解析的符号(问号)。

它说的是i386(自动)。实际上,当我将arch设置为“i386:x86-64:intel”时,它启动时没有错误消息,但当我尝试输入代码时,它会告诉我:“无法访问地址为0x1f7fb5000的内存”。你能运行整个程序吗(gdbserver、gdb、32位应用程序)在客户端计算机上?您是否遇到了相同的问题?是的,32位lib在/lib中,64位在/lib64中。我尝试了gdb-nx,但没有注意到任何差异?