我有两台相同的 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 需要什么?
下面的例子,谢谢,
Jerry
你好.cpp:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello World." << std::endl;
return -1;
}
以下是三个运行:
- 在 gdb 中,设置架构 i386 / 然后连接到 gdbserver => bad Architecture
- 在 gdb 中,设置架构 i386 / file hello / 然后连接到 gdbserver => bad Architecture
- 在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)