问题描述
我有两台相同的 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?
以下示例,谢谢,
杰瑞
你好.cpp:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello World." << std::endl;
return -1;
}
这里是三个运行:
- 在 gdb 中,设置架构 i386/然后连接到 gdbserver => 架构错误
- 在 gdb 中,设置架构 i386/文件 hello/然后连接到 gdbserver => 架构错误
- 在 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 抱怨内存访问或数据格式错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!