如何在OS X 10.9(Mavericks)上使用GDB而不是LLDB调试ELF文件?

时间:2014-04-26 18:55:18

标签: macos gdb lldb

我有一个名为app2的ELF可执行文件,它是在Linux下编译的,并且它无法在Mac上由GDB调试。但是使用LLDB没有问题。

Peterx:Documents Peter$ file app2
app2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped

和gdb信息:

Peterx:Documents Peter$ gdb app2
GNU gdb (GDB) 7.7
Copyright (C) 2014 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 "x86_64-apple-darwin13.1.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
"/Users/Peter/Documents/app2": not in executable format: File format not recognized

Peterx:Documents Peter$ ./app2
-bash: ./app2: Permission denied

设置断点然后将其删除。

Peterx:Documents Peter$ lldb app2
Current executable set to 'app2' (x86_64).
(lldb) b main
Breakpoint 1: where = app2`main + 8 at app2.c:4, address = 0x00000000004004fc
(lldb) br del 1
1 breakpoints deleted; 0 breakpoint locations disabled.
(lldb) quit

2 个答案:

答案 0 :(得分:2)

Linux和Mac OS X(OS X)具有不同的可执行格式(Linux中的ELF,OSX中的Mach-O)并使用不同的ABI。所以你不能在OSX下从linux运行可执行文件或在linux下从OSX运行可执行文件。唯一的变体是使用qemu,virtualbox或parallels等模拟器,并将正确的操作系统安装到虚拟机中。

  

但使用LLDB没有问题。

实际上LLDB存在问题。第一个问题:LLDB确实打开ELF二进制文件(它可以解析ELF格式)而不检查ELF头。您的ELF来自Linux,它在标头中具有不兼容的OS_ABI字段。我认为LLDB应该尽早失败或打印警告。这可以向LLDB错误跟踪器报告。

第二个问题:日志中实际上没有调试:

Peterx:Documents Peter$ lldb app2
Current executable set to 'app2' (x86_64).
(lldb) b main
Breakpoint 1: where = app2`main + 8 at app2.c:4, address = 0x00000000004004fc
(lldb) br del 1
1 breakpoints deleted; 0 breakpoint locations disabled.
(lldb) quit

仅从ELF读取符号,但仍然没有app2的运行。 LLDB不会运行app2,并且此日志不使用LLDB作为实际调试器,而是将其用作nmobjdump来获取符号地址,读取调试信息和反汇编代码。

您的gdb仅配置了Mach-O二进制支持,您的版本无法解析ELF二进制文件。如果你将配置带有ELF读取支持的gdb,它可以从linux加载和解析ELF。可能它会显示文件中的sybmols,解析debuginfo和反汇编函数。但它仍然无法改变ABI,也不会运行app2

答案 1 :(得分:2)

除了人们上面所说的,请注意你实际上可以在mac上使用lldb来“交叉调试”到linux机器。例如,在Linux机器上,您可以使用gdbserver启动或附加到您的应用程序,然后使用lldb的gdb-remote命令连接到该调试服务器以实际调试它。如果你想进行两次机器调试,但是只有一台Mac&amp;一个Linux盒子。

因此,这不是lldb将读入并在ELF文件上设置断点的错误,这是预期的行为。当然,“run”不会做任何有用的事情,因为二进制文件不会本地运行。

最后,有一个Linux的lldb端口和一些人正在研究的BSD。