如何在 iOS 的 crash log 上 debug

2025-06-20 11:16:50
推荐回答(1个)
回答1:

 1.在提交新版本到AppStore时候一定要保留每个版本的.dSYM文件。无法定位crash的代码肯定是.dSYM文件和crash report对应的程序版本不一致。
  2.由用户反馈的当前版本的crash report可以在iTunesConnect下载。如果是存在设备上的,可以用Organizer导出
  3.打开.crash文件,参考Hardware Model确定故障设备是armv6还是armv7架构。
  4.利用.dSYM定位调用栈记录中未确定的offset。

  比如有如下记录:
  Last Exception Backtrace:
  0 CoreFoundation 0x3440a8bf __exceptionPreprocess
  1 libobjc.A.dylib 0x3465a1e5 objc_exception_throw
  2 CoreFoundation 0x3440a7b9 +[NSException raise:format:]
  3 CoreFoundation 0x3440a7db +[NSException raise:format:]
  4 CoreFoundation 0x3437762b -[__NSCFDictionary setObject:forKey:]
  5 MyApp 0x000e6f8b 0x1000 + 941963
  6 MyApp 0x0004140b 0x1000 + 263179
  ...//更多stacktrace
  使用atos命令和.dSYM确定0x000e6f8b和0x0004140b的对应代码。在命令行中输入:
  atos -o MyApp.app/MpApp -arch armv7 0x000e6f8b 0x0004140b
  得到如下结果:
  -[MyViewController foo:] (in MyApp) (MyViewController.m:457)
  -[MyDelegate bar:] (in MyApp) (MyDelegate.m:441)

  这样就确定了调用栈中offset对应的源代码位置。注意如果此时.dSYM文件版本不对,会得到完全无用的错误结果。之后就可以根据所有信息综合分析,确定crash的原因并修正。