在带有Centos 5的64位机器上使用带有32位二进制文件的gdb和gdbserver会抱怨内存访问或数据格式不正确
我有两台相同的64位Centos 5机器,它们联网,并共享它们的/主挂载。我在一台机器上编译了一个简单的Hello World程序,然后我就知道了如何在一台机器上使用gdb远程调试在另一台机器上运行的程序。当每个人都默认为64位时,这似乎可以正常工作 然而,如果我用-m32编译Hello World以生成一个32位二进制文件,就像编译我们的完整系统一样,那么我就无法弄清楚如何让gdb和gdbserver正确连接。在我们的全套系统上试用之前,我想我应该让它和hello一起工作。根据我尝试连接gdb和gdbserver的方式,我会收到关于寄存器格式错误的消息、关于体系结构不匹配的警告或非法内存引用的消息 我似乎不太了解-m32在我的编译中的含义,也不知道如何启动gdb和gdbserver,也不知道指定体系结构、文件或其他东西的正确顺序( 在64位linux机器上的32位(-m32)可执行文件上使用gdb和gdbserver需要什么 下面的例子,谢谢大家 杰里 hello.cpp:在带有Centos 5的64位机器上使用带有32位二进制文件的gdb和gdbserver会抱怨内存访问或数据格式不正确,gdb,32bit-64bit,gdbserver,Gdb,32bit 64bit,Gdbserver,我有两台相同的64位Centos 5机器,它们联网,并共享它们的/主挂载。我在一台机器上编译了一个简单的Hello World程序,然后我就知道了如何在一台机器上使用gdb远程调试在另一台机器上运行的程序。当每个人都默认为64位时,这似乎可以正常工作 然而,如果我用-m32编译Hello World以生成一个32位二进制文件,就像编译我们的完整系统一样,那么我就无法弄清楚如何让gdb和gdbserver正确连接。在我们的全套系统上试用之前,我想我应该让它和hello一起工作。根据我尝试连接gdb
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello World." << std::endl;
return -1;
}
关于我们当地的:
==============================
- 假设它是i386 32位,将archi设置为i386,然后连接 注意:在gdb端,尚未指定或加载可执行文件
- 假设它是i386 32位,将archi设置为i386,然后连接 注意:在gdb端,可执行文件已加载文件
- 假设它是i386:x86-64(这应该是错误的),将archi设置为i386:x86-64,然后连接 注意:在gdb端,可执行文件已加载文件
如果要使用64位gdb/gdbserver调试32位进程,则需要更新版本的gdb。尤其需要:
gdbserver/ChangeLog:
2009-05-12 Doug Evans <dje@google.com>
Biarch support for i386/amd64 gdbserver.
并使用gdb32/gdbserver32调试您的进程。不过,我不认为这样做有任何好处——较新版本的GDB有很多修复程序、加速功能,STL漂亮的打印机也不错。非常感谢您的帮助,我非常感谢您的帮助,明天我将在工作中尝试。是的,我在两天前查阅了最新gdbserver的手册,并且当我发现漂亮的打印机时,几乎是绘图仪了。很抱歉,我恢复了一个非常旧的主题,但我想知道是否有任何方法不更新GDB。我正在使用Windows计算机进行连接,所以我可以为Windows构建32位模式的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)
$ 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)
$ 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)
gdbserver/ChangeLog:
2009-05-12 Doug Evans <dje@google.com>
Biarch support for i386/amd64 gdbserver.
./configure CC='gcc -m32'