-->

哪里/如何做一个可执行文件内苹果GCC店矮(where/how does Apples GCC st

2019-06-23 10:22发布

在哪里/如何做一个可执行文件内苹果GCC店矮?

我通过编译的二进制gcc -gdwarf-2苹果GCC)。 然而,无论是objdump -g也不objdump -h不告诉我任何调试信息。

此外libbfd没有发现任何调试信息。 (我问这件事了binutils的,邮件列表在这里 。)

我能够然而,通过提取调试信息dsymutil (成的dSYM)。 libbfd也能读取这些调试信息即可。

Answer 1:

在Mac OS X中是有链接(决定ld )当你链接您的程序无法处理所有的调试信息。 调试信息的可执行程序,从而具有连接过程中的所有调试信息的,包括它的二进制可执行文件是一个严重损害链接就经常10倍大小。 对于迭代开发 - 编译,链接,编译,连接,调试,编译链接 - 这是一个真正的打击。

相反,编译器生成的.s文件中的DWARF调试信息,汇编器输出的.o文件和链接器包括可执行二进制文件,它告诉所有的符号时被拆迁调试信息的用户“调​​试地图”链接。

消费者(这样做的.o文件调试)从可执行文件加载调试地图和处理都在按需.o文件的侏儒,重新映射的符号按调试地图的指示。

dsymutil可以被看作是一个调试信息链接。 它这样做是相同的过程 - 读取调试地图,加载从.o文件的矮人,搬迁所有的地址 - 然后在他们的最后,链接地址输出所有的侏儒的单个二进制。 这是捆绑的dSYM。

一旦你有一个的dSYM捆绑,你有普通的旧标准矮,任何侏儒阅读工具(可处理Mach-O的二进制文件)可以处理。

有一个额外的细化,使所有这些工作,包括在Mach-O的二进制文件的UUID。 每个链接器创建一个二进制时间,其发射在LC_UUID负荷命令128位UUID(诉otool -hlvdwarfdump --uuid )。 这唯一标识二进制文件。 当dsymutil创建的dSYM,它包括UUID。 如果他们匹配的UUID的调试器将只关联一个的dSYM和可执行文件 - 没有躲闪文件MOD时间戳或类似的东西。

我们也可以使用的UUID找到dSYMs的二进制文件。 他们在崩溃报告显示,我们包括可以用它来寻找他们聚光灯进口商,如mdfind "com_apple_xcode_dsym_uuids == E21A4165-29D5-35DC-D08D-368476F85EE1"如果的dSYM位于聚光灯索引位置。 你甚至可以有dSYMs为贵公司的资料库和程序,可以检索给定UUID正确的dSYM - 也许有点mysql数据库或类似的东西 - 所以你随机可执行文件运行调试器,您即刻拥有所有调试该可执行文件的信息。 有一些漂亮整洁的东西,你可以用的UUID做。

但无论如何,要回答你的问题的起源:在剥开二进制具有调试地图,.o文件有矮,当dsymutil运行这些被合并起来创建的dSYM束。

如果你想看到调试映射条目,做nm -pa executable和他们都在那里。 他们是老刺NLIST记录的形式 - 链接已经知道如何处理刺所以这是最易于使用 - 但你会看到它是如何工作没有太多的麻烦,也许是指一些刺的文件,如果你不确定。



Answer 2:

现在看来,这其实没有。

我跟踪dsymutil和读取所有*.o文件。 objdump -h还列出了他们的所有调试信息。

如此看来,这些信息不会被复制到二进制文件。


这个相关的一些评论也可以找到这里 。



Answer 3:

这似乎有两种方式OSX放置调试信息:

  1. .o用于编译目标文件。 二进制存储这些文件的引用(通过绝对路径)。

  2. 在所谓的单独的捆(目录).dSYM

如果我使用苹果的铛编译g++ -g main.cpp -o foo我得到称为丛foo.dSYM 。 但是,如果我使用的CMake我得到的目标文件的调试信息。 我猜是因为它做了单独gcc -c main.cpp -o main.o一步?

无论如何,我发现这个命令的情况下,1非常有用:

$ dsymutil -dump-debug-map main
---
triple:          'x86_64-apple-darwin'
binary-path:     main
objects:         
  - filename:        /Users/tim/foo/build/CMakeFiles/main.dir/main.cpp.o
    timestamp:       1485951213
    symbols:         
      - { sym: __ZNSt3__111char_traitsIcE11eq_int_typeEii, objAddr: 0x0000000000000D50, binAddr: 0x0000000100001C90, size: 0x00000020 }
      - { sym: __ZNSt3__111char_traitsIcE6lengthEPKc, objAddr: 0x0000000000000660, binAddr: 0x00000001000015A0, size: 0x00000020 }
      - { sym: GCC_except_table3, objAddr: 0x0000000000000DBC, binAddr: 0x0000000100001E2C, size: 0x00000000 }
      - { sym: _main, objAddr: 0x0000000000000000, binAddr: 0x0000000100000F40, size: 0x00000090 }
      - { sym: __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m, objAddr: 0x00000000000001F0, binAddr: 0x0000000100001130, size: 0x00000470 }
      - { sym: ___clang_call_terminate, objAddr: 0x0000000000000D40, binAddr: 0x0000000100001C80, size: 0x00000010 }
      - { sym: GCC_except_table5, objAddr: 0x0000000000000E6C, binAddr: 0x0000000100001EDC, size: 0x00000000 }
      - { sym: __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_, objAddr: 0x0000000000000680, binAddr: 0x00000001000015C0, size: 0x000006C0 }
      - { sym: __ZNSt3__14endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_, objAddr: 0x00000000000000E0, binAddr: 0x0000000100001020, size: 0x00000110 }
      - { sym: GCC_except_table2, objAddr: 0x0000000000000D7C, binAddr: 0x0000000100001DEC, size: 0x00000000 }
      - { sym: __ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc, objAddr: 0x0000000000000090, binAddr: 0x0000000100000FD0, size: 0x00000050 }
      - { sym: __ZNSt3__111char_traitsIcE3eofEv, objAddr: 0x0000000000000D70, binAddr: 0x0000000100001CB0, size: 0x0000000B }
...


Answer 4:

苹果店在调试名为* .dSYM单独的文件信息。 您可以在这些文件上运行dwarfdump看看DWARF调试信息条目。



文章来源: where/how does Apples GCC store DWARF inside an executable