首页 > 学院 > 开发设计 > 正文

利用.dSYM和.app文件准确定位Crash位置

2019-11-09 15:03:55
字体:
来源:转载
供稿:网友
当发布到iphone上的应用程序Crash之后,iPhone会自动生成一个Crash Log(*.crash),这个文件包含了一些有用的调试信息,但对于堆栈,它只记录的函数地址,而无法显示函数名。函数名保存在一个叫dSYM的二进制文件中,即一个调试符号表文件。首先,确保在release(Ad Hoc或者App Store)一个版本时,保存了对应的xxx.app和xxx.dSYM文件。

其次,验证xxx.crash、xxx.app和xxx.dSYM三者的uuid是否一致。

验证方法:

1)查看xxx.app的uuid。

[plain] view plaincopyPRint?在CODE上查看代码片$ dwarfdump --uuid mobileguard.app/mobileguard  

2)查看xxx.dSYM的uuid。

[plain] view%20plaincopyprint?$ dwarfdump --uuid mobileguard.app.dSYM/Contents/Resources/DWARF/mobileguard  3)xxx.crash。

上面两个UUID必须一样,而且必须跟Crash%20Log里面的UUID一致。打开Crash%20Log文件,在”Binary%20Images:”段中,YourApp后面的尖括号内的字符串就是UUID了。 crash%20log%20uuid%20:%20armv7%20 <1dd5eb047491310f88cb7b1d7f61275c>%20/var/mobile/applications/581404D9-FF06-455F-8251-846D41D18B40/Note:

在这之前,需要找到对应的app和dSYM文件。这两个文件是在后缀为.archive的文件中,在我的机器(Mac%20OS%2010.9.1,Xcode5.0.2)上,.archive文件在“/Users/mikelin/Library/Developer/Xcode/Archives/”文件夹下对应的日期文件夹中,也可以从Xcode%20>%20Organizer%20>%20Archive%20下找到对应的Archive包。

确保三者uuid一致以后,用symbolicatecrash工具生成易读的日志信息。

首先找到symbollicatecrash工具在哪里:

find%20/Applications/Xcode.app%20-name%20symbolicatecrash%20-type%20f

你会找到:

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

方法一:使用.crash文件和dsym文件

先准备环境:

1)将symbolicatecrash文件拷贝到和那三个文件的同级目录,此方法不需要.app文件。

2)设置xcode DEVELOPER_DIR。

[plain] view%20plaincopyprint?export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"  

然后执行命令:

[plain] view%20plaincopyprint?symbolicatecrash m.crash mobileguard.app.dSYM > n.crash  

转载:http://blog.csdn.net/jinzhu117/article/details/20615991

方法二:使用.crash文件和.app文件

如果没有完整的.crash格式的崩溃文件,只有局部的崩溃信息,如下:

[plain] view%20plaincopyprint?Thread%200%20Crashed:0%20  libobjc.A.dylib%20              0x00003ec0%20objc_msgSend%20+%20241%20  MyApp%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 0x000036d2%200×1000%20+%209938 其中:0x000036d2为栈地址,0×1000为偏移量。

我们可以在控制台使用atos命令,解析出内存地址,此方法不需要.dsym文件。

[plain] view%20plaincopyprint?派生到我的代码片$ atos -o MyApp.app/MyApp -arch arm64(崩溃日志中标明的架构) -l 0×1000(偏移量) 0x000036d2(栈地址) 结果示例:__24-[MyApp initBase]_block_invoke.243 (in MyApp) (MyAppStart.m:286) 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表