【问题标题】:Remote debug error with GDBGDB 远程调试错误
【发布时间】:2010-10-16 09:56:39
【问题描述】:

我尝试在 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

【问题讨论】:

    标签: linux debugging gdb virtual-machine


    【解决方案1】:

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

    【讨论】:

    • 上面写着 i386(自动)。实际上,当我将 arch 设置为“i386:x86-64:intel”时,它启动时没有错误消息,但是当我尝试单步执行代码时,它给了我:“无法访问地址 0x1f7fb5000 的内存”。跨度>
    • 你能在客户端机器上运行整个东西(gdbserver、gdb、32 位应用程序)吗?你是否也遇到过同样的问题?
    【解决方案2】:

    64 位 GDB 可以直接调试 32 位和 64 位劣质进程(我相信这称为多架构支持)。

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

    您需要一个匹配目标架构的gdbserver,以及一个匹配gdbservergdb。从源代码构建它们,使用--target=i686 进行配置。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,32 位库在 /lib 中,64 位库在 /lib64 中。我试过 gdb -nx 但我没有发现任何区别?
      【解决方案4】:

      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 加载共享库时发疯。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-09-22
          • 2017-02-03
          • 2012-01-03
          • 1970-01-01
          • 2023-03-29
          • 2011-11-29
          • 2020-09-21
          • 2014-03-10
          • 2015-04-29
          相关资源
          最近更新 更多