32位gdb可以调试64位二进制文件吗?

32位gdb可以调试64位二进制文件吗?,gdb,solaris,32bit-64bit,Gdb,Solaris,32bit 64bit,32位gdb能否调试64位二进制文件?是。32位gdb可以在Solaris上调试64位二进制文件,至少在最新版本上是这样 $ cat /etc/release Oracle Solaris 11 Express snv_151a X86 Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. Assem

32位gdb能否调试64位二进制文件?

是。32位gdb可以在Solaris上调试64位二进制文件,至少在最新版本上是这样

$ cat /etc/release
                      Oracle Solaris 11 Express snv_151a X86
     Copyright (c) 2010, Oracle and/or its affiliates.  All rights reserved.
                           Assembled 04 November 2010
$ file /usr/bin/gdb
/usr/bin/gdb:   ELF 32-bit LSB executable 80386 Version 1 [FPU], dynamically linked, not stripped, no debugging information available
$ file a 
a:              ELF 64-bit LSB executable AMD64 Version 1, dynamically linked, not stripped
$ gdb a                                 
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-pc-solaris2.11"...
(gdb) b main
Breakpoint 1 at 0x400e9c: file a.c, line 3.
(gdb) run
Starting program: /tmp/a 

Breakpoint 1, main () at a.c:3
3               printf("hello world !");
(gdb) quit
The program is running.  Exit anyway? (y or n) y
$
$cat/etc/release
Oracle Solaris 11 Express snv_151a X86
版权所有(c)2010,Oracle和/或其附属公司。版权所有。
2010年11月4日组装
$file/usr/bin/gdb
/usr/bin/gdb:ELF 32位LSB可执行文件80386版本1[FPU],动态链接,未剥离,无可用调试信息
$a文件
a:ELF 64位LSB可执行文件AMD64版本1,动态链接,未剥离
$gdb a
GNU gdb 6.8
版权所有(C)2008免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i386-pc-solaris2.11”。。。
(gdb)b干管
0x400e9c处的断点1:文件a.c,第3行。
(gdb)运行
启动程序:/tmp/a
断点1,主()位于a.c:3
3 printf(“你好,世界!”);
(gdb)退出
程序正在运行。还是退出?(y或n)y
$
但是,如果您仔细观察,这个32位gdb正在幕后启动一个64位gdb:

$ truss -f -t execve /usr/bin/gdb a
1793:   execve("/usr/bin/gdb", 0x0804755C, 0x08047568)  argc = 2
1793:   execve("/usr/bin/amd64/gdb", 0x0804755C, 0x08047568)  argc = 2
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-pc-solaris2.11"...
(gdb)
$truss-f-t execve/usr/bin/gdb a
1793:execve(“/usr/bin/gdb”,0x0804755C,0x08047568)argc=2
1793:execve(“/usr/bin/amd64/gdb”,0x0804755C,0x08047568)argc=2
GNU gdb 6.8
版权所有(C)2008免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i386-pc-solaris2.11”。。。
(gdb)
无论调试的二进制文件是32位还是64位,它都会执行此操作

我仍然认为调试器在Solaris下与进程交互的方式与大小无关,因此从技术上讲,仅32位的二进制调试器应该能够调试64位程序


64位gdb能够调试32位和64位二进制文件,但32位gdb不能调试64位二进制文件。这就是你所经历的。

上面的答案不正确。您需要一个64位调试器来调试64位进程。这正是gdb在幕后提供64位自身拷贝的原因。

非常感谢。在我的env:/usr/local/bin/gdb:ELF 32位LSB可执行文件80386 Version 1(动态链接,未剥离)中,我遇到以下错误:附加到程序“/*****/sd”,进程5139/proc/5139:值对于定义的数据类型太大。do_attach:无法保存跟踪错误您应该在问题中添加额外信息,而不是评论。如果您也像我一样提供有关Solaris和gdb版本的更多信息,这会有所帮助。谢谢您的评论(可能应该以这样的方式发布,而不是回复)。回复已更正。我似乎没有足够的StackOverflow“布朗尼点数”来评论其他人的答案,所以我不得不将其作为新答案提交。