如何在 iOS 的 crash log 上 debug
发布网友
发布时间:2022-04-21 15:41
我来回答
共2个回答
热心网友
时间:2022-04-14 07:36
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的原因并修正。
热心网友
时间:2022-04-14 08:54
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的原因并修正。