dsym 文件的结构是啥?
Posted
技术标签:
【中文标题】dsym 文件的结构是啥?【英文标题】:what the structure of dsym file?dsym 文件的结构是什么? 【发布时间】:2014-07-25 17:53:07 【问题描述】:构建应用程序时生成的 dsym 文件的结构是什么。我知道它包含 DWARF 调试信息,但什么是 dsym 文件。我想看里面的DWARF信息。
它只是一个仅包含调试部分的 Mach-O 二进制文件吗?如何将它传递给像 pyelftool
这样的 DWARF 解析工具,它会读取 ELF 文件调试部分中的 DWARF 信息。
我使用objdump -h
打印dsym文件的各个部分(.dsym文件是一个包,我只是引用包中的二进制文件)
/Users/luna/Desktop/EarList.app.dSYM/Contents/Resources/DWARF/EarList: file format mach-o-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00001738 000026e0 000026e0 00000000 2**4
ALLOC, LOAD, CODE
1 .symbol_stub 00000054 00003e18 00003e18 00000000 2**1
ALLOC, LOAD, CODE
2 __TEXT.__stub_helper 00000098 00003e6c 00003e6c 00000000 2**2
ALLOC, LOAD, READONLY, CODE
3 .const 00000010 00003f08 00003f08 00000000 2**3
ALLOC, LOAD, READONLY, DATA
4 __TEXT.__objc_methname 000007db 00003f18 00003f18 00000000 2**0
ALLOC, LOAD, READONLY, CODE
5 .cstring 000001a9 000046f3 000046f3 00000000 2**0
ALLOC, LOAD, READONLY, DATA
6 __TEXT.__objc_classname 0000003c 0000489c 0000489c 00000000 2**0
ALLOC, LOAD, READONLY, CODE
7 __TEXT.__objc_methtype 0000049d 000048d8 000048d8 00000000 2**0
ALLOC, LOAD, READONLY, CODE
8 __TEXT.__unwind_info 0000007c 00004d75 00004d75 00000000 2**0
ALLOC, LOAD, READONLY, CODE
9 .eh_frame 00000204 00004df8 00004df8 00000000 2**3
ALLOC, LOAD, READONLY, DATA
10 __DATA.__program_vars 00000014 00005000 00005000 00000000 2**2
ALLOC, LOAD, DATA
11 .non_lazy_symbol_pointer 00000008 00005014 00005014 00000000 2**2
ALLOC, LOAD, DATA
12 .lazy_symbol_pointer 00000038 0000501c 0000501c 00000000 2**2
ALLOC, LOAD, DATA
13 __DATA.__objc_classlist 00000008 00005054 00005054 00000000 2**2
ALLOC, LOAD, DATA
14 __DATA.__objc_protolist 00000008 0000505c 0000505c 00000000 2**2
ALLOC, LOAD, DATA
15 __DATA.__objc_imageinfo 00000008 00005064 00005064 00000000 2**2
ALLOC, LOAD, DATA
16 __DATA.__objc_const 00000518 00005070 00005070 00000000 2**3
ALLOC, LOAD, DATA
17 __DATA.__objc_selrefs 00000054 00005588 00005588 00000000 2**2
ALLOC, LOAD, DATA
18 __DATA.__objc_clas-s-refs 00000010 000055dc 000055dc 00000000 2**2
ALLOC, LOAD, DATA
19 __DATA.__objc_superrefs 00000004 000055ec 000055ec 00000000 2**2
ALLOC, LOAD, DATA
20 __DATA.__objc_data 00000050 000055f0 000055f0 00000000 2**2
ALLOC, LOAD, DATA
21 .cfstring 00000290 00005640 00005640 00000000 2**2
ALLOC, LOAD, DATA
22 __DATA.__objc_ivar 00000004 000058d0 000058d0 00000000 2**2
ALLOC, LOAD, DATA
23 .data 00000058 000058d4 000058d4 00000000 2**2
ALLOC, LOAD, DATA
24 __DATA.__common 00000010 0000592c 0000592c 00000000 2**2
ALLOC
25 .debug_abbrev 0000028a 00008000 00008000 00002000 2**0
CONTENTS, DEBUGGING
26 .debug_aranges 000000c0 0000828a 0000828a 0000228a 2**0
CONTENTS, DEBUGGING
27 .debug_info 0000813c 0000834a 0000834a 0000234a 2**0
CONTENTS, DEBUGGING
28 __DWARF.__debug_inlined 00000038 00010486 00010486 0000a486 2**0
CONTENTS, ALLOC, LOAD, DATA
29 .debug_line 00001205 000104be 000104be 0000a4be 2**0
CONTENTS, DEBUGGING
30 .debug_pubnames 0000028e 000116c3 000116c3 0000b6c3 2**0
CONTENTS, DEBUGGING
31 .debug_pubtypes 0000159f 00011951 00011951 0000b951 2**0
CONTENTS, DEBUGGING
32 .debug_str 00005e4f 00012ef0 00012ef0 0000cef0 2**0
CONTENTS, DEBUGGING
33 __DWARF.__apple_names 0000033c 00018d3f 00018d3f 00012d3f 2**0
CONTENTS, ALLOC, LOAD, DATA
34 __DWARF.__apple_types 000016a3 0001907b 0001907b 0001307b 2**0
CONTENTS, ALLOC, LOAD, DATA
35 __DWARF.__apple_namespac 00000024 0001a71e 0001a71e 0001471e 2**0
CONTENTS, ALLOC, LOAD, DATA
36 __DWARF.__apple_objc 00000088 0001a742 0001a742 00014742 2**0
CONTENTS, ALLOC, LOAD, DATA
【问题讨论】:
【参考方案1】:dSYM 确实是一个容器(目录),其中包含一个 Mach O 二进制文件,仅包含 DWARF 调试数据,没有代码。
您可以在 Python 中使用filebytes 和pyelftools 对其进行检查:
import io
from filebytes.mach_o import MachO
from elftools.dwarf.dwarfinfo import DWARFInfo, DebugSectionDescriptor, DwarfConfig
macho = MachO(filename)
data =
section.name: DebugSectionDescriptor(io.BytesIO(section.bytes), section.name, None, len(section.bytes), 0)
for loadcmd in macho.loadCommands
if getattr(loadcmd, 'name', None) == '__DWARF'
for section in loadcmd.sections
dwarfinfo = DWARFInfo(
config=DwarfConfig(
little_endian=True,
default_address_size=8, # 64 bit
machine_arch='x64',
),
debug_info_sec=data['__debug_info'],
debug_aranges_sec=None,
debug_abbrev_sec=data['__debug_abbrev'],
debug_frame_sec=None,
eh_frame_sec=data['__eh_frame'],
debug_str_sec=data['__debug_str'],
debug_loc_sec=data['__debug_loc'],
debug_ranges_sec=data['__debug_ranges'],
debug_line_sec=data['__debug_line']
)
【讨论】:
@SevaAlekseyev 即使使用来自 master 的文件字节,解析 dsym 文件也会返回带有.bytes == None
的部分,这是预期的行为吗?
据我所知,DSYM 文件实际上并没有非 DWARF 部分,但它们仍列在标题中。我想这个想法是这些部分正确地驻留在应用程序文件中,并且这些部分应该并排存在。
仅供参考:在 Xcode 的 Mach-O object 文件中,带有调试信息的加载命令不称为“__DWARF”。所以data =...
片段中的if
语句应该去if loadcmd.header.cmd in (LC.SEGMENT, LC.SEGMENT_64)
,如果你想解析.o文件。
更新:filebytes
中的 dSYM 兼容性拉取请求已被接受,它已在 PyPI 上发布。【参考方案2】:
您将能够使用dwarfdump
命令读取 DWARF 调试信息。
【讨论】:
【参考方案3】:https://pypi.org/project/dwex/ 上还有一个 GUI DWARF Explorer。通过在命令中运行pip install dwex
进行安装,然后使用dwex
运行。
它支持 dSYM 捆绑包。将一个拖到主窗口上,然后观察树。
【讨论】:
以上是关于dsym 文件的结构是啥?的主要内容,如果未能解决你的问题,请参考以下文章
上传 DSYMS 文件失败。我已经上传了 myapp.app.dSYM 压缩文件,但它再次要求我上传“上传缺少所需的 dSYM”