1、去符号
1.1、Edit Scheme...选中release
Edit Scheme...1.2、Deployment Postprocessing选择YES。
1、Strip Linked Product 选项在 Deployment Postprocessing 设置为 YES 的时候才生效,而在 Archive 的时候 Xcode 总是会把 Deployment Postprocessing 设置为 YES
2、并不是所有的符号都是必须的,比如 Debug Map,Xcode 提供给我们 Strip Linked Product 来去除不需要的符号信息(Strip Style 中选择的选项相应的符号),去除了符号信息之后我们就只能使用 dSYM 来进行符号化了,所以需要将 Debug Information Format 修改为 DWARF with dSYM file。
3、Xcode 生成 dSYM是依赖 DWARF。Xcode 编译实际的操作步骤是:生成带有 DWARF 调试信息的可执行文件 -> 提取可执行文件中的调试信息打包成 dSYM -> 去除符号化信息。去除符号是单独的步骤,使用的是 strip 命令。
- dSYM:独立的符号表文件,主要用来做发布产品的崩溃符号化。dSYM 是一个压缩包,里面包含了 DWARF 文件。
- DWARF:一种通用的调试文件格式,支持源码级别的调试,调试信息存在于 对象文件中,一般都比较大。Xcode 调试模式下一般都是使用 DWARF 来进行符号化的。
4、Strip Style分为三个选择项
- All Symbols: 去除所有符号,一般是在主工程中开启。
- Non-Global Symbols: 去除一些非全局的 Symbol(保留全局符号,Debug Symbols 同样会被去除),链接时会被重定向的那些符号不会被去除,此选项是静态库/动态库的建议选项。
-
Debugging Symbols: 去除调试符号,去除之后将无法断点调试。
Deployment Postprocessing = YES
1.3、MachOView查看mach-o文件
查看文件,此时只有间接符号保留
Mach-O
2、符号断点
2.1、设置Strip Style为Debugging Symbols
Debugging Symbols在Xcode代码中设置断点,无法成功捕获
断点
2.1、设置符号断点
设置符号断点NSLog,编译运行,能够成功断点
符号断点NSLog
在控制台打印bt,可以看到___lldb_unnamed_symbol1名称,为去符号后的本地符号
image.png
3、恢复符号
3.1、Mach-O文件分析
在去符号的Mach-O文件中,虽然只有间接符号,但是表__objc_methname,__objc_classname,__objc_methtype,String Table依然存在,为确保运行时态可以正确的找到需要的执行方法。
符号
3.2、恢复符号
使用命令行工具restore-symbol恢复符号表
将Mach-O拷贝到当前目录中,执行命令./restore-symbol Demo -o Demo2
查看Demo2可以看到本地符号和全局符号已恢复
该方法只能恢复runtime的函数,c函数无法恢复
网友评论