Swift/iOS 崩溃日志不包含行号信息。

3
我正在通过TestFlight向测试人员部署构建,并且应用程序崩溃了。我无法在自己的端上重现此问题,因此我试图依靠Xcode组织器中列出的崩溃日志来确定原因。

不幸的是,这里的崩溃日志包含一些信息,但没有任何让我识别导致崩溃的代码行的信息。通常,当我在组织器窗口中单击崩溃时,它会自动显示在Xcode中引起崩溃的代码行。

下面是原始崩溃日志,其中也没有包含行号,只有发生崩溃的文件和方法。
Thread 0 name:
Thread 0 Crashed:
0   libswiftCore.dylib              0x0000000103154b8c 0x102f64000 + 2034572
1   libswiftCore.dylib              0x0000000103154b8c 0x102f64000 + 2034572
2   libswiftCore.dylib              0x000000010316017c 0x102f64000 + 2081148
3   libswiftCore.dylib              0x0000000103105cfc 0x102f64000 + 1711356
4   libswiftCore.dylib              0x0000000103160984 0x102f64000 + 2083204
5   libswiftCore.dylib              0x00000001030ad2f8 0x102f64000 + 1348344
6   AppName                         0x0000000102c92748 specialized TableViewController.sendSmsMessage(sender:) + 8816 (TableViewController.swift:0)

(TableViewController.swift:0)
7   AppName                         0x0000000102c8c448 @objc TableViewController.CorF(sender:) + 44
8   UIKitCore                       0x00000001ea7a6314 -[UIApplication sendAction:to:from:forEvent:] + 96 (UIApplication.m:4786)
9   UIKitCore                       0x00000001ea233d54 -[UIControl sendAction:to:forEvent:] + 80 (UIControl.m:624)
10  UIKitCore                       0x00000001ea234074 -[UIControl _sendActionsForEvents:withEvent:] + 440 (UIControl.m:707)
11  UIKitCore                       0x00000001ea233074 -[UIControl touchesEnded:withEvent:] + 568 (UIControl.m:461)
12  UIKitCore                       0x00000001ea7dfa6c -[UIWindow _sendTouchesForEvent:] + 2472 (UIWindow.m:2204)
13  UIKitCore                       0x00000001ea7e0cd0 -[UIWindow sendEvent:] + 3156 (UIWindow.m:2453)
14  UIKitCore                       0x00000001ea7bffcc -[UIApplication sendEvent:] + 340 (UIApplication.m:10819)
15  UIKitCore                       0x00000001ea88ee38 __dispatchPreprocessedEventFromEventQueue + 1620 (UIEventDispatcher.m:1678)
16  UIKitCore                       0x00000001ea891830 __handleEventQueueInternal + 4740 (UIEventDispatcher.m:1937)
17  UIKitCore                       0x00000001ea88a320 __handleHIDEventFetcherDrain + 152 (UIEventDispatcher.m:1905)
18  CoreFoundation                  0x00000001bd44a0e0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24 (CFRunLoop.c:1980)
19  CoreFoundation                  0x00000001bd44a060 __CFRunLoopDoSource0 + 88 (CFRunLoop.c:2015)
20  CoreFoundation                  0x00000001bd449944 __CFRunLoopDoSources0 + 176 (CFRunLoop.c:2051)
21  CoreFoundation                  0x00000001bd444810 __CFRunLoopRun + 1040 (CFRunLoop.c:2922)
22  CoreFoundation                  0x00000001bd4440e0 CFRunLoopRunSpecific + 436 (CFRunLoop.c:3247)
23  GraphicsServices                0x00000001bf6bd584 GSEventRunModal + 100 (GSEvent.c:2245)
24  UIKitCore                       0x00000001ea7a4c00 UIApplicationMain + 212 (UIApplication.m:4347)
25  AppName                         0x0000000102c7d0f0 main + 60 (SMS.swift:12)
26  libdyld.dylib                   0x00000001bcf02bb4 start + 4

有什么办法可以确定导致崩溃的代码行吗?
编辑:我已经按照 @Václav 的建议让用户将存储在其设备上的崩溃报告发送给我,但似乎里面也没有什么有用的信息。
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libswiftCore.dylib              0x0000000104e774ec 0x104c8c000 + 2012396
1   libswiftCore.dylib              0x0000000104e774ec 0x104c8c000 + 2012396
2   libswiftCore.dylib              0x0000000104e828cc 0x104c8c000 + 2058444
3   libswiftCore.dylib              0x0000000104e28fd4 0x104c8c000 + 1691604
4   libswiftCore.dylib              0x0000000104e830cc 0x104c8c000 + 2060492
5   libswiftCore.dylib              0x0000000104dd142c 0x104c8c000 + 1332268
6   AppName                         0x00000001047fa948 0x1047e0000 + 108872
7   AppName                         0x00000001047f4784 0x1047e0000 + 83844
8   UIKitCore                       0x00000001e6fe6314 0x1e66fc000 + 9347860
9   UIKitCore                       0x00000001e6a73d54 0x1e66fc000 + 3636564
10  UIKitCore                       0x00000001e6a74074 0x1e66fc000 + 3637364
11  UIKitCore                       0x00000001e6a73074 0x1e66fc000 + 3633268
12  UIKitCore                       0x00000001e6bfaaf0 0x1e66fc000 + 5237488
13  UIKitCore                       0x00000001e6bf57ec 0x1e66fc000 + 5216236
14  UIKitCore                       0x00000001e6bf52cc 0x1e66fc000 + 5214924
15  UIKitCore                       0x00000001e6bf509c 0x1e66fc000 + 5214364
16  UIKitCore                       0x00000001e7020cb4 0x1e66fc000 + 9587892
17  UIKitCore                       0x00000001e6ffffcc 0x1e66fc000 + 9453516
18  UIKitCore                       0x00000001e70cee38 0x1e66fc000 + 10300984
19  UIKitCore                       0x00000001e70d1830 0x1e66fc000 + 10311728
20  UIKitCore                       0x00000001e70ca320 0x1e66fc000 + 10281760
21  CoreFoundation                  0x00000001b9c8a0e0 0x1b9bdd000 + 708832
22  CoreFoundation                  0x00000001b9c8a060 0x1b9bdd000 + 708704
23  CoreFoundation                  0x00000001b9c89944 0x1b9bdd000 + 706884
24  CoreFoundation                  0x00000001b9c84810 0x1b9bdd000 + 686096
25  CoreFoundation                  0x00000001b9c840e0 0x1b9bdd000 + 684256
26  GraphicsServices                0x00000001bbefd584 0x1bbef2000 + 46468
27  UIKitCore                       0x00000001e6fe4c00 0x1e66fc000 + 9341952
28  AppName                         0x00000001047e5860 0x1047e0000 + 22624
29  libdyld.dylib                   0x00000001b9742bb4 0x1b9742000 + 2996

@Mattie,我正在使用TestFlight分发测试构建。然而,看起来Crashlytics已经安装在这里,但是我在我们的Crashlytics账户中找不到任何记录,所以我认为这是一个失败的安装。Crashlytics是否可能干扰了TestFlight崩溃报告中的行? - Mark Lyons
我敢打赌,根据函数sendSms的名称,他们正在针对iPad进行测试,而您正在针对具有短信功能的iPhone进行测试。您能展示一下函数体吗? - Neil Galiaskarov
1
在偏移量为0x102c92748的位置设置一个断点,然后逐步执行... - l'L'l
1
我认为你不能将“Debug”发送到TF。正如你所说,我几乎100%确定TF会强制发布。您可以在设置为英国区域设置的真实设备上构建它,并尝试在连接到XCode并启用“All Exceptions”断点时崩溃。 - Václav
1
@Václav,这是个好主意。让我试试看。 - Mark Lyons
显示剩余15条评论
1个回答

2
这个问题有几个不同的元素,让我来尝试分解一下。 为什么我会看到第0行? Swift编译器在实际生成最终编译二进制文件之前会进行相当多的代码生成。在这种情况下,“line 0”是编译器告诉您,它在编译TableViewController.swift时生成了代码,但该代码与原始源中的特定行不对应。
因为您在这里使用了一个“specialized”函数,所以我更倾向于认为这是编译器生成的代码。这通常意味着编译器正在使用通用类型。
我很失望苹果以这种方式传达了这个事件,但我们无能为力。我的理解是DWARF可以描述这种情况。但是,苹果可能没有使用此功能,它没有写入崩溃报告,或者最有可能两者都没有。
您可以通过使用“atos”或“dwarfdump”来符号化地址“0x0000000102c92748”来验证此行为。我敢打赌,它将完全输出相同的内容-第0行。过去,我曾使用“dwarfdump”在这里四处转悠,看看dSYM中是否编码了更多信息,但我没有找到任何东西。虽然那是几年前的事了,所以事情可能已经改变了。 第三方崩溃报告程序有用吗? 它们都使用dSYM进行符号化,因此它们不能比该文件中包含的信息更多。无论如何,这可能值得一试,但我怀疑您在第0行方面不会有任何进展。
但是,它们可能能够解析来自libswiftCore.dylib的框架,这可能非常有帮助。 为什么会发生这种崩溃? 这是百万美元的问题。
我想看到实际的崩溃细节。我的猜测是它是一个非法指令,因为您已经在Swift运行时库内部崩溃了。可能正在发生的是运行时遇到某种非法状态。解包nil Optional肯定是其中之一。也可能是越界的Range操作。我认为数组索引越界也可能以这种方式失败,但是从头脑中记起来,我不确定。
我会仔细查看TableViewController.sendSmsMessage(sender:)中正在发生的事情。特别注意上述列出的内容,特别是它是否与任何通用标准库函数交互。
我也会尝试对那些libswiftCore.dylib框架进行符号化。同样,您可以使用atos来实现这一点,只需将其指向库本身并使用加载地址即可。我不确定Xcode在内部保存Swift库的位置,因此您可能需要使用与您的应用程序捆绑的库的副本。
祝你好运!

谢谢@Mattie!我尝试了一些在SO上经常建议的事情,就像你描述的那样——符号化、atos等等。但我仍然得到同样的结果:第0行。一个新的进展是,我能够让用户发送给我崩溃报告,但它似乎一点用也没有。 - Mark Lyons
绝对同意,最好进行一些侦探工作来隔离问题,而不是仅仅依靠崩溃报告。但问题在于,崩溃报告似乎只提供了导致崩溃的函数这一信息,而该函数非常庞大。我开始认为,唯一实现这一目标的方法就是将其拆分成许多更小的函数,以提供更具体的指示,从而确定触发崩溃的位置。 - Mark Lyons
我知道获取行号会很好,但你无法做到。编译器没有在任何地方编码该信息 - 它已经消失了 :( 你尝试过符号化那些libswiftCore.dylib框架吗?另一方面,这可能会给你一些线索。至于重构那个函数,绝对去做吧! - Mattie
我会尝试一下。我将接受您的答案,因为它解释了这里发生了什么。感谢您的所有帮助! - Mark Lyons
很高兴能提供帮助! - Mattie

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