当符号化崩溃报告时,我注意到行号是关闭的。我在一个项目中测试了这个,我故意造成了崩溃。它似乎生成的行号不包括某些行,例如注解行或编译器预处理器语句(不确定它包括和不包括什么)...
是否有一种简单的方法可以从符号化崩溃报告中的“off”行号获得源代码中的实际代码行?
编辑:符号化崩溃报告中的一行示例:
7 Luisterpaal 0x00005de2 -[SWFMP3 connection:didReceiveData:] (SWFMP3.m:320)
所以,320行几乎是正确的,但不完全正确。它偏离了几行...
3条答案
按热度按时间3mpgtkmj1#
一句话......不。如果你在事故报告中看到这样一行字:
0 com.苹果.核心基金会0x 95 cb 046 b CFArrayAppendValue + 43
“+43”不是行号,而是从函数开始的内存位置。你编写的代码在编译后的二进制文件中根本不存在--编译器会优化和更改代码(至少在发布版本中),所以它通常与你编写的代码不匹配。
不幸的是,解决方案是为遇到崩溃的人提供一个调试版本,您可以远程调试或至少抛出NSLog()语句来帮助跟踪它,和/或编写较小的方法。
a1o7rhls2#
我也遇到过这个问题,但只是因为我在查看比编译成崩溃的二进制代码更新的代码版本。当我返回源代码历史并找到相应版本的源代码时,行号完全匹配。
djp7away3#
一个可能有用的建议-您可以使用
dwarfdump
命令检查.dSYM
文件中的DWARF调试表,并确认它们与符号化崩溃报告的输出一致。假设您在崩溃报告中看到代码地址
0x100024914
。请注意,这不是实际的内存地址,而是假设可执行文件加载到标准内存位置0x100000000
的内存地址。出于安全原因,实际内存地址是随机的(通过添加一个称为"slide"的随机值),但是崩溃报告堆栈跟踪中的代码地址删除了该幻灯片。现在您可以执行以下操作:
您将得到如下所示的输出:
现在,如果您确认
dwarfdump
中的行号与符号化崩溃报告中的行号一致(我希望它会),这样,您就知道崩溃符号化引擎本身没有任何问题(Apple未记录的CoreSymbolication
框架)-它正确地输出了可用的DWARF调试数据。(与开发人员的困惑相反,比如在另一个答案中提到的,查看了错误版本的源文件),看起来bug必须在编译器中(有点不太可能,但肯定是以前没有发生过的事情)。