如何让Xcode 12中Thread.callStackSymbols输出的堆栈信息可读
Thread.callStackSymbols 不可读的修复方案
首先确认编译配置(大概率遗漏的前置步骤)
打开项目Target的Build Settings面板,检查以下三个配置项:
- Debug Information Format:Debug模式下必须选择
DWARF with dSYM File,Xcode默认模拟器Debug模式仅生成不带符号的DWARF文件,不会生成完整调试符号 - Strip Debug Symbols During Copy:Debug模式下设置为
NO,避免编译过程中剥离调试符号信息 - Optimization Level:Debug模式下设置为
None[-O0],高优化等级会导致符号地址偏移、行号映射错乱
已获取的十六进制堆栈的符号化方法
你之前的命令操作存在错误,修正后按以下步骤执行即可:
方法1:直接用Xcode调试控制台命令(最简便)
不需要手动执行终端命令,在断点触发时直接在Xcode调试控制台输入bt,即可直接输出带方法名、行号的完整可读堆栈。
如果要单独查某个堆栈地址对应的代码位置,输入:image lookup -a [你拿到的堆栈十六进制地址]
执行后会直接返回对应方法、所属文件、行号信息。
方法2:atos命令修正版
你之前的加载地址计算逻辑错误,不需要手动通过offset换算:
- 在Xcode调试控制台输入
image list,输出的第一行的十六进制地址就是你项目主二进制的实际加载地址,直接复制即可 - 右键Xcode左侧导航栏Products下的App产物,选择Show in Finder,获取.app包的路径,右键选择「显示包内容」,找到和项目同名的主二进制文件
- 终端执行命令:
atos -o [主二进制文件完整路径] -l [复制的加载地址] [堆栈中的十六进制地址]
注意:调试阶段不要直接用dSYM文件作为atos的输入,用.app内的主二进制文件即可。
方法3:dwarfdump命令修正版
你之前的命令拼写错误,正确拼写为dwarfdump,调试阶段不需要额外计算符号地址,直接执行即可:dwarfdump --lookup [堆栈十六进制地址] --arch [模拟器对应架构,x86_64/arm64] [dSYM文件完整路径]
内容的提问来源于stack exchange,提问作者Geetanshu Gulati
相关产品推荐
相关产品推荐

