本地构建的iOS应用程序崩溃日志符号化

8

我在stackoverflow和苹果网站上阅读了许多帖子,但仍然无法使基本功能正常运行。我创建了我的应用程序的调试版本,并将其安装到我的手机上,该版本有意崩溃。我在未连接Xcode调试器的情况下运行此应用程序。应用程序崩溃了,如何查看现在崩溃回溯的函数名称和行号?

我尝试在Xcode中打开设备窗口,然后查看日志,在那里我可以看到我的应用程序的崩溃日志。我看到它在崩溃之前执行了多个函数调用,但是所有这些函数都以十六进制地址而不是实际符号显示。我需要做什么才能使其正常工作?

4个回答

10

打开项目设置。进入你的目标(Target),将调试信息格式设置为DWARF with dSYM File,用于调试。同样地,也要对项目进行相同操作。


项目:
项目


目标: 目标


1
然后呢?问题是如何完全符号化应用程序现有的崩溃报告,该应用程序仅通过Xcode进行开发安装在设备上。崩溃发生时设备未连接到Xcode,并且没有存档,因此没有.dysm文件。 - RyanTCB
我会检查一下,但我非常确定我们已经适当地设置了所有符号,因为它能够在真正的发布版本中运行,并且从应用商店下载时我们得到了适当的符号化。我的问题只是关于本地构建。 - Pavel P

2
若您仍拥有引发崩溃的构建版本所对应的符号文件,Xcode会为您解析崩溃报告,此过程可能需要几秒钟。如果该符号文件存在,请耐心等待,崩溃报告将自动更新。
但是,如果在此期间更改了代码并触发了新的构建,则该构建及其符号文件将被覆盖并获得新的UUID(每个CPU架构一个)。该UUID是崩溃报告(“Binary Images”部分)的一部分,并用于在Mac上查找匹配的符号文件。如果找不到该文件,则无法进行符号化。

我会检查一下。在我的情况下,我会构建一个版本,将其运行在设备上(从Xcode菜单中),这样就可以在手机上安装我的应用程序。然后,我停止XCode的执行。现在,我在手机上有了我的构建版本,并直接从手机上运行它,但是它崩溃了。这就是使用情况,所有的构建工件仍然保持在Xcode侧。我自己做了一些工具来符号化回溯,这不需要超过一秒钟的时间,我已经将它们列出并打开在XCode侧相当长的一段时间了,它们从OS组件中列出了一些函数名称,但我的代码都是十六进制的。 - Pavel P

1

有没有解决方案?我正好遇到了这个问题。我在iPad上构建、运行它,停止执行,然后手动启动应用程序。它会崩溃,我去设备日志中查看,崩溃信息在那里,但无法进行符号化:

0   CoreFoundation                  0x1b0d035ac __exceptionPreprocess + 220
1   libobjc.A.dylib                 0x1c4d7d42c objc_exception_throw + 59
2   CoreFoundation                  0x1b0c0c1b4 +[NSException raise:format:arguments:] + 99
3   Foundation                      0x1b1f6a7bc -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 131
4   xxxxxxxxxxxxxxx                 0x102f6c2d4 0x102f64000 + 33492
5   xxxxxxxxxxxxxxx                 0x102f6c23c 0x102f64000 + 33340
6   xxxxxxxxxxxxxxx                 0x102f76754 0x102f64000 + 75604
7   xxxxxxxxxxxxxxx                 0x102f764ac 0x102f64000 + 74924
8   xxxxxxxxxxxxxxx                 0x102f76f40 0x102f64000 + 77632
9   xxxxxxxxxxxxxxx                 0x102f83fa0 0x102f64000 + 130976

我的应用程序名称中没有Unicode字符(实际上并不是xxxxxxx)。


第一个答案解决了我的问题。转到您的项目并将Debug信息格式设置为带有调试dSYM文件的DWARF(目标已经以这种方式设置(Xcode 12)。 - Colin Blake

1

你的项目名称中可能使用了无效字符,这是可能的吗?

我曾经遇到过同样的问题,看到的是十六进制而不是实际的函数名称。结果发现我的应用程序名称“➕”中有一个Unicode字符。我将其删除后,在Xcode中的后续崩溃日志中,函数调用就能正确显示了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接