首页 文章

GDB远程调试错误

提问于
浏览
6

我试图在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 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 Mon 1月21日13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux

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

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

欢迎任何建议 .

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

设置架构i386:x86-64

5 回答

  • 0

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

    gdbserver 不是这样:它不支持多拱调试 .

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

  • 0

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

  • 0

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

  • 2

    1)您的目标机器和主机(在您的情况下适合目标机器的机器)需要一个合适的gdb服务器 .

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

    我将在目标上需要一个ppc可执行文件gdbserver .

    我需要在我的主机上为powerpc提供x86可执行文件gdb .

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

    set solib-absolute-prefix $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE

    dir $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE

    否则主机gdb会疯狂尝试加载x86的共享库 .

  • 3

    我认为您需要在主机上运行gdb并附带目标程序的副本 . 即如果在目标计算机上运行 gdbserver myprog ,则需要将 myprog 复制到主机并运行 gdb myprog .

    这样主机上的gdb将自动从可执行文件中获取体系结构 . 像这样在主机上运行gdb也会加载符号,如果没有这些符号,您将获得未解析的符号(问号) .

相关问题