Macos 如何在OSX10.9(Mavericks)上使用GDB而不是LLDB调试ELF文件?

Macos 如何在OSX10.9(Mavericks)上使用GDB而不是LLDB调试ELF文件?,macos,gdb,lldb,Macos,Gdb,Lldb,我有一个名为app2的ELF可执行文件,它是在Linux下编译的,它不能在Mac上被GDB调试。但是使用它没有问题 以及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>

我有一个名为app2的ELF可执行文件,它是在Linux下编译的,它不能在Mac上被GDB调试。但是使用它没有问题

以及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$ 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

Linux和Mac 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 bug tracker

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

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、解析debuginfo和反汇编函数。但它仍然无法更改ABI,也不会运行app2。

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 bug tracker

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

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、解析debuginfo和反汇编函数。但是它仍然无法更改ABI,也不会运行app2。

除了上面提到的内容之外,请注意,您实际上可以在mac上使用lldb来交叉调试到linux机器。例如,在Linux机器上,您可以使用gdbserver启动或连接到您的应用程序,然后使用lldb的gdb remote命令连接到调试服务器以实际调试它。如果您想进行两台机器的调试,但只有一台Mac和一台Linux机器,这可能很方便

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


最后,还有一个用于Linux的lldb端口和一些BSD端口,很多人都在使用这些端口。

除了上面提到的内容之外,请注意,您实际上可以在mac上使用lldb来交叉调试Linux机器。例如,在Linux机器上,您可以使用gdbserver启动或连接到您的应用程序,然后使用lldb的gdb remote命令连接到调试服务器以实际调试它。如果您想进行两台机器的调试,但只有一台Mac和一台Linux机器,这可能很方便

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


最后,还有一个用于Linux的lldb端口和一些BSD端口,许多人正在使用这些端口。

在哪里使用lldb,在Mac上还是在Linux上?ELF文件不能在不同的操作系统之间移植,因此不能在MAC OS X上从Linux app2运行ELF文件,因为它是不同类型的unix。你需要为MAC OS X重新编译它。我在Linux上创建了app2,然后在MAC OS上使用了GDB和LLDB。我想知道为什么它可以由LLDB运行,但不能由GDB运行。我认为OSX的LLDB不应该执行Linux应用程序,例如。在没有调试器的情况下,能否在OSX上启动app2?您可以显示与lldb的调试会话吗?当然可以。你是对的,它不能在OSX上运行。你还想answ吗

对于这个问题,如果你不能在OSX下执行ELF二进制文件,你在哪里使用LLDB,Mac还是Linux?ELF文件不能在不同的操作系统之间移植,因此不能在MAC OS X上从Linux app2运行ELF文件,因为它是不同类型的unix。你需要为MAC OS X重新编译它。我在Linux上创建了app2,然后在MAC OS上使用了GDB和LLDB。我想知道为什么它可以由LLDB运行,但不能由GDB运行。我认为OSX的LLDB不应该执行Linux应用程序,例如。在没有调试器的情况下,能否在OSX上启动app2?您可以显示与lldb的调试会话吗?当然可以。你是对的,它不能在OSX上运行。考虑到你不能在OSX+1下执行ELF二进制文件,你还想回答这个问题吗?+1作为旁白,《Mac OS X和IOS Internals:to the Apple’s Core》一书的作者乔纳森·莱文猜测苹果是否会在即将发布的OSX/IOS版本中开始使用ELF。我自己也看不到改变的好处,但是很有趣。特洛伊木马,LLDB只能支持ELF在Linux上工作。我认为可以遵循LLVM的一般原则,在默认构建中支持所有平台和格式;虽然gdb更像gcc,但有几十种平台和格式,不能同时启用。gcc和gdb的思想是为每个平台或两个平台构建特定版本的工具,以防交叉投诉/交叉调试。@PeterPop,如果您的问题已经解决,并且不需要更多的答案,您可以通过单击其左侧的v形符号来接受我的答案。osgx拥有它。gdb的体系结构支持是通过预处理器宏和类似的编译时技巧来完成的,因此您不能构建一个支持多个体系结构的gdb二进制文件。lldb使用插件机制来支持不同的体系结构和操作系统,因此可以在一个二进制文件中构建它来支持多种体系结构。这两个调试器都可以进行跨架构调试,读取MacOS上的ELF文件,然后连接到Linux机器并远程调试运行在那里的二进制文件。但对于gdb来说,你必须构建正确的gdb来实现这一点。+1作为旁白,《MacOSX和IOS内部:苹果的核心》一书的作者JonathanLevin猜测苹果是否会在即将发布的OSX/IOS版本中开始使用ELF。我自己也看不到改变的好处,但是很有趣。特洛伊木马,LLDB只能支持ELF在Linux上工作。我认为可以遵循LLVM的一般原则,在默认构建中支持所有平台和格式;虽然gdb更像gcc,但有几十种平台和格式,不能同时启用。gcc和gdb的思想是为每个平台或两个平台构建特定版本的工具,以防交叉投诉/交叉调试。@PeterPop,如果您的问题已经解决,并且不需要更多的答案,您可以通过单击其左侧的v形符号来接受我的答案。osgx拥有它。gdb的体系结构支持是通过预处理器宏和类似的编译时技巧来完成的,因此您不能构建一个支持多个体系结构的gdb二进制文件。lldb使用插件机制来支持不同的体系结构和操作系统,因此可以在一个二进制文件中构建它来支持多种体系结构。这两个调试器都可以进行跨架构调试,读取MacOS上的ELF文件,然后连接到Linux机器并远程调试运行在那里的二进制文件。但是对于gdb,您必须构建正确的gdb来实现这一点。
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