7

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

我启动 gdbserver 作为监听端口 12345 (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)

这是调试服务器机器(uname -a):

Linux 服务器 2.6.16.60-0.31-smp #1 SMP Tue Oct 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 Mon Jan 21 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

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

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

欢迎任何建议。

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

设置架构 i386:x86-64

4

5 回答 5

3

也许您需要set architecture i386(gdb)提示符下执行类似的操作?show architecture连接到远程目标后会说什么?

于 2009-03-30T16:38:36.780 回答
2

一个 64 位的 GDB 可以直接调试 32 位和 64 位的劣质进程(我相信这叫做多架构支持)。

不是这样gdbserver:它不支持多架构调试。

您需要一个gdbserver与目标架构相匹配的,并且gdbgdbserver. 从源代码构建它们,使用--target=i686.

于 2009-04-04T22:03:12.103 回答
0

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

于 2009-03-30T17:15:06.210 回答
0

1)您需要为您的目标机器和主机(适合您的情况下的目标机器的机器)提供合适的 gdbserver。

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

我的目标需要一个 ppc 可执行 gdbserver。

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

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

设置 solib-absolute-prefix $ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE

目录 $ELDK_PREFIX/eldk-4.2-ppc_4xx/$CROSS_COMPILE

否则主机 gdb 会疯狂地尝试为 x86 加载共享库。

于 2009-05-28T22:17:49.933 回答
0

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

这样,主机上的 gdb 将自动从可执行文件中获取架构。像这样在主机上运行 gdb 也会加载符号,没有它你会得到未解析的符号(问号)。

于 2014-12-18T12:31:34.190 回答