8

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

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

我似乎对 -m32 在我的编译中的含义知之甚少,也不知道如何启动 gdb 和 gdbserver 或指定体系结构或文件或其他内容的正确顺序。:(

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

下面的例子,谢谢,

杰瑞

你好.cpp:

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

}

以下是三个运行:

  1. 在 gdb 中,设置架构 i386 / 然后连接到 gdbserver => 糟糕的架构
  2. 在gdb中,设置架构i386 /文件hello /然后连接到gdbserver => bad architecture
  3. 在 gdb 中,设置架构(错误)i386:x86-64 / file hello / 然后连接到 gdbserver => 无法访问内存

或者更详细一点:

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

对于每次运行,远程 gdbserver 都会说:


    $ gdbserver --multi rdev6:2010 hello
    Process hello created; pid = 32603
    Listening on port 2010
    Remote debugging from host 134.51.26.149
    readchar: Got EOF
    Remote side has terminated connection.  GDBserver will reopen the connection.
    Listening on port 2010

在我们的本地:

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

  • 假设是i386 32位,将archi设置为i386,然后连接注意:在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)

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

  • 假设是i386 32位,将archi设置为i386,然后连接注意:在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)

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

  • 假设(这应该是不正确的)它是 i386:x86-64,将 archi 设置为 i386:x86-64,然后连接注意:在 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)
4

1 回答 1

5

如果要使用 64 位 gdb/gdbserver 调试 32 位进程,则需要更新版本的 GDB。特别是,你需要这个:

gdbserver/ChangeLog:

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

        Biarch support for i386/amd64 gdbserver.

或者,您可以通过运行以 32 位模式从源代码构建您已经拥有的 gdb/gdbserver

./configure CC='gcc -m32'

并使用 gdb32/gdbserver32 调试您的进程。不过,我看不出这样做有什么好处——新版本的 GDB 有许多修复、加速和 STL 漂亮的打印机很好。

于 2010-06-19T04:11:25.073 回答