如何在 OS X 10.9 (Mavericks) 上使用 GDB 而不是 LLDB 调试 ELF 文件?
Posted
技术标签:
【中文标题】如何在 OS X 10.9 (Mavericks) 上使用 GDB 而不是 LLDB 调试 ELF 文件?【英文标题】:How do I debug an ELF file using GDB instead of LLDB on OS X 10.9 (Mavericks)? 【发布时间】:2014-04-26 18:55:18 【问题描述】:我有一个名为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
【问题讨论】:
你在哪里使用 LLDB,在 Mac 上还是在 Linux 上? ELF 文件不能在不同的操作系统之间移植,因此您不能在 MAC OS X(它是不同类型的 unix)上从 Linux (app2
) 运行 ELF 文件。你需要为 MAC OS X 重新编译它。
我在 Linux 上创建了 (app2),然后在 MAC OS 上使用了 GDB 和 LLDB。我想知道为什么它可以由 LLDB 运行,但由 GDB 失败。
我认为 OSX 的 LLDB 不应该执行 linux 应用程序(例如***.com/a/9439548/196561)。你可以在没有调试器的情况下在 OSX 上启动你的 app2 吗?你能用 lldb 显示调试会话吗?
当然。你是对的,它不能在 OSX 上运行。
鉴于您无法在 OSX 下执行 ELF 二进制文件,您还想回答这个问题吗?
【参考方案1】:
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 作为真正的调试器,而是使用它作为nm
或objdump
来获取符号地址、读取调试信息和反汇编代码。
您的 gdb 配置为仅支持 Mach-O 二进制文件,而您的版本无法解析 ELF 二进制文件。如果您将配置 gdb 以支持 ELF 读取,它可能会从 linux 加载和解析 ELF。可能它会显示文件中的 sybmols、解析调试信息和反汇编函数。但它仍然无法更改 ABI,也不会运行 app2
。
【讨论】:
+1 另外,Mac OS X and ios Internals: To the Apple's Core 一书的作者 Jonathan Levin 推测 Apple 是否会在即将发布的版本中开始使用 ELF OSX/iOS 的。我自己看不到改变的好处,但仍然很有趣。 木马,LLDB 只能支持 ELF 在 Linux 上工作。而且我认为它可以遵循 LLVM 的通用原则,在默认构建中支持所有平台和格式;而gdb
更像gcc
- 有几十个平台和格式,它们不能同时启用。 gcc 和 gdb 的思想是为每个平台(或在交叉编译/交叉调试的情况下的一对平台)构建特定版本的工具。
@PeterPop,如果您的问题已经解决并且不需要更多答案,您可以通过单击左侧的“v”形符号“接受”我的答案。
osgx 有。 gdb 的体系结构支持是通过预处理器宏和类似的编译时间技巧完成的,因此您无法构建支持多种体系结构的单个 gdb 二进制文件。 lldb 使用插件机制来支持不同的架构和操作系统,因此可以构建它以在一个二进制文件中支持多种架构。两个调试器都可以进行跨架构调试(在 MacOS 上读取 ELF 文件,然后连接到 Linux 机器并远程调试在其中运行的二进制文件。)但是对于 gdb,您必须构建正确的 gdb 才能做到这一点。【参考方案2】:
除了上面所说的之外,请注意,您实际上可以在 mac 上使用 lldb 来“交叉调试”到 linux 机器。例如,在 Linux 机器上,您可以使用 gdbserver 启动或附加到您的应用程序,然后使用 lldb 的 gdb-remote 命令连接到该调试服务器以实际调试它。如果您想进行两台机器调试,但只有一台 Mac 和一台 Linux 机器,这可能会很方便。
因此,lldb 将读取并在您的 ELF 文件上设置断点不是错误,这是预期的行为。当然,“运行”不会做任何有用的事情,因为二进制文件不会原生运行。
最后,有一个用于 Linux 的 lldb 端口和一些 BSD 的端口,许多人正在开发。
【讨论】:
以上是关于如何在 OS X 10.9 (Mavericks) 上使用 GDB 而不是 LLDB 调试 ELF 文件?的主要内容,如果未能解决你的问题,请参考以下文章
Aspell 不会在 OS X 10.9 (Mavericks) 上构建
OS X v10.9 (Mavericks) 中缺少 GDB
OS X 10.9 Mavericks - 使用虚拟主机设置本地主机
在 migratePersistentStore: 到 OS X 10.9 Mavericks 上的另一个 URL 后访问 NSManagedObject 属性时崩溃