http://liujun.me/?p=110
xcode提供了两个工具来将crash文件的内存地址转换到代码中的具体位置: symbolicatecrash和dwarfdump
symbolicatecrash可以将crash文件中的内存地址转换成代码中类和方法,使用方法如下:
symbolicatecrash + 崩溃日志 + APP对应的.dSYM文件 + > + 输出到的文件
symbolicatecrash的位置似乎不是固定的,可以使用find命令查找一下,需要注意的是,第一次使用的时候,需要配置环境变量
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
dwarfdump的作用是查看每个内存地址对应的代码。首先查看crash log中的崩溃线程,假如是这样的:
Thread 0 Crashed:
0 libobjc.A.dylib 0x00003ec0 objc_msgSend + 24
1 MyApp 0x000036d2 0×1000 + 9938
我们得到了用户发生崩溃情况的内存地址:0x000036d2
然后回到我们应用程序的build目录,目录下一定要包含MyApp.app 和MyApp.app.dSYM两个文件。
在该目录下使用命令:
dwarfdump –lookup 0x000036d2 MyApp.app.dSYM
ok, 这会就能定位到bug位置了
And one more thing is,如果是调试当中遇到了异常崩溃情况,但是在栈信息中定位不到代码位置,可以通过设置断点的方式来捕获崩溃位置:
Xcode -> Debug -> BreakPoints -> Create Exception BreakPoint…
这个断点可以捕获所有异常抛出的事件,一般的数组越界,空指针异常都能搞定