我有两台相同的 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;
}
以下是三个运行:
- 在 gdb 中,设置架构 i386 / 然后连接到 gdbserver => 糟糕的架构
- 在gdb中,设置架构i386 /文件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)