在带有Centos 5的64位机器上使用带有32位二进制文件的gdb和gdbserver会抱怨内存访问或数据格式不正确

在带有Centos 5的64位机器上使用带有32位二进制文件的gdb和gdbserver会抱怨内存访问或数据格式不正确,gdb,32bit-64bit,gdbserver,Gdb,32bit 64bit,Gdbserver,我有两台相同的64位Centos 5机器,它们联网,并共享它们的/主挂载。我在一台机器上编译了一个简单的Hello World程序,然后我就知道了如何在一台机器上使用gdb远程调试在另一台机器上运行的程序。当每个人都默认为64位时,这似乎可以正常工作 然而,如果我用-m32编译Hello World以生成一个32位二进制文件,就像编译我们的完整系统一样,那么我就无法弄清楚如何让gdb和gdbserver正确连接。在我们的全套系统上试用之前,我想我应该让它和hello一起工作。根据我尝试连接gdb

我有两台相同的64位Centos 5机器,它们联网,并共享它们的/主挂载。我在一台机器上编译了一个简单的Hello World程序,然后我就知道了如何在一台机器上使用gdb远程调试在另一台机器上运行的程序。当每个人都默认为64位时,这似乎可以正常工作

然而,如果我用-m32编译Hello World以生成一个32位二进制文件,就像编译我们的完整系统一样,那么我就无法弄清楚如何让gdb和gdbserver正确连接。在我们的全套系统上试用之前,我想我应该让它和hello一起工作。根据我尝试连接gdb和gdbserver的方式,我会收到关于寄存器格式错误的消息、关于体系结构不匹配的警告或非法内存引用的消息

我似乎不太了解-m32在我的编译中的含义,也不知道如何启动gdb和gdbserver,也不知道指定体系结构、文件或其他东西的正确顺序(

在64位linux机器上的32位(-m32)可执行文件上使用gdb和gdbserver需要什么

下面的例子,谢谢大家

杰里

hello.cpp:

#include <iostream>
int main(int argc, char *argv[])
{
    std::cout << "Hello World." << std::endl;
    return -1;

}
关于我们当地的:

==============================

  • 假设它是i386 32位,将archi设置为i386,然后连接 注意:在gdb端,尚未指定或加载可执行文件
==============================

  • 假设它是i386 32位,将archi设置为i386,然后连接 注意:在gdb端,可执行文件已加载文件
==============================

  • 假设它是i386:x86-64(这应该是错误的),将archi设置为i386:x86-64,然后连接 注意:在gdb端,可执行文件已加载文件

如果要使用64位gdb/gdbserver调试32位进程,则需要更新版本的gdb。尤其需要:

gdbserver/ChangeLog:

2009-05-12  Doug Evans  <dje@google.com>

        Biarch support for i386/amd64 gdbserver.

并使用gdb32/gdbserver32调试您的进程。不过,我不认为这样做有任何好处——较新版本的GDB有很多修复程序、加速功能,STL漂亮的打印机也不错。

非常感谢您的帮助,我非常感谢您的帮助,明天我将在工作中尝试。是的,我在两天前查阅了最新gdbserver的手册,并且当我发现漂亮的打印机时,几乎是绘图仪了。很抱歉,我恢复了一个非常旧的主题,但我想知道是否有任何方法不更新GDB。我正在使用Windows计算机进行连接,所以我可以为Windows构建32位模式的GDB吗?

    $ gdb
    GNU gdb Fedora (6.8-37.el5)
    his GDB was configured as "x86_64-redhat-linux-gnu".
    (gdb) set archi i386
    The target architecture is assumed to be i386
    (gdb) target extended-remote rdev6:2010
    Remote debugging using rdev6:2010
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    Try to load the executable by `file' first,
    you may also check `set/show architecture'.
    (gdb)

    $ gdb
    GNU gdb Fedora (6.8-37.el5)
    his GDB was configured as "x86_64-redhat-linux-gnu".
    (gdb) set archi i386
    The target architecture is assumed to be i386
    (gdb) file hello
    Reading symbols from /home/j/hello...done.
    (gdb) target extended-remote rdev6:2010
    Remote debugging using rdev6:2010
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
    Try to load the executable by `file' first,
    you may also check `set/show architecture'.
    (gdb) sho archi
    The target architecture is assumed to be i386
    (gdb)

    $ gdb
    GNU gdb Fedora (6.8-37.el5)
    This GDB was configured as "x86_64-redhat-linux-gnu".
    (gdb) set archi i386:x86-64
    The target architecture is assumed to be i386:x86-64
    (gdb) file hello
    Reading symbols from /home/j/hello...done.
    (gdb) show archi
    The target architecture is assumed to be i386:x86-64
    (gdb) target extended-remote rdev6:2010
    Remote debugging using rdev6:2010
    [New Thread 32667]
    Cannot access memory at address 0x800000008
    (gdb)
gdbserver/ChangeLog:

2009-05-12  Doug Evans  <dje@google.com>

        Biarch support for i386/amd64 gdbserver.
./configure CC='gcc -m32'