本文介绍了在带有 Centos 5 的 64 位机器上使用带有 32 位二进制文​​件的 gdb 和 gdbserver 会抱怨内存访问或格式错误的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have two identical 64 bit Centos 5 machines, that are networked, and share their /home mount. I compile a simple Hello World program on one, and then I have figured out how to use gdb on one machine to remotely debug it running on the other machine. That seems to work fine when everyone defaults to 64 bitness.

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

However, if I compile my Hello World with -m32 to generate a 32 bit binary, the way our full up system is being compiled, then I cannot figure out how to get gdb and gdbserver to correctly connect. Before I try it on our full up system, I figure I should get it working with hello. Depending on how I try connecting gdb and gdbserver, I either get messages about badly formatted registers, warnings about architecture mismatches, or illegal memory references.

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

I seem to have little understanding of what the implications of -m32 are in my compile and no idea of how to start gdb and gdbserver or the right order to specify architecture or files or something. :(

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

What does it take to use gdb and gdbserver on a 32 bit (-m32) executable on a 64 bit linux box?

示例如下,谢谢,

杰瑞

hello.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 => 架构错误
  3. 在 gdb 中,设置架构(错误地)i386:x86-64/file hello/然后连接到 gdbserver => 无法访问内存

或者更详细一点:

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

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

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

For each run, the remote gdbserver said:


    $ 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)

推荐答案

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

If you want to debug 32-bit process using 64-bit gdb/gdbserver, you need a newer version of GDB. In particular, you need this:

gdbserver/ChangeLog:

2009-05-12  Doug Evans  <[email protected]>

        Biarch support for i386/amd64 gdbserver.

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

Alternatively, you can build gdb/gdbserver you already have from source in 32-bit mode by running

./configure CC='gcc -m32'

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

and use gdb32/gdbserver32 to debug your processes. I don't see any advantage of doing this though -- newer versions of GDB have many fixes, speedups, and STL pretty printers are nice.

这篇关于在带有 Centos 5 的 64 位机器上使用带有 32 位二进制文​​件的 gdb 和 gdbserver 会抱怨内存访问或格式错误的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-14 22:56