今天第一天寫技術博客,主要是想通過寫博客記錄一些自己作爲ios開發工程師的一些歷程。
好啦,現在進去正題。由於自己的程序今天發現了一些bug,卻不知道怎麼解決,所以今天就研究了下用symbolicatecrash來分析crash log來找到問題的根源。
一、首先在桌面建立一個crash的文件夾
1.xcode->windows->organizer->archives 找到app 右鍵show in finder 。
2.然後你就會看到你的.xcarchive文件,然後顯示包內容,把.DYSM文件和.app文件拷貝到crash文件夾中
二、下面我們要找到symbolicatecrash工具的地址
1.打開終端輸入以下命令:find /Applications/Xcode.app -name symbolicatecrash -type f
你會找到:
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
2.用命令將symbolicatecrash拷貝到crash文件夾中,與.DYSM和.app文件放到一起
cp /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash /Users/yang/Desktop/crash
這樣就將symbolicatecrash拷貝到了crash文件夾下
3.然後再將crash文件一同拷貝到crash文件夾下
這裏稍微說一下怎麼取得crash文件。在xcode6之前crash文件是在organizer裏面 在xcode6之後在windows->devices裏面,選擇你crash的設備,然後導出crash文件到crash文件夾下
三、執行symbolicatecrash
1.打開終端切換到crash文件夾的目錄下
在這裏推薦一個叫go2shell的軟件,可以在crash文件夾下點擊直接進入crash文件夾的目錄下,挺方便的
2.執行命令
./symbolicatecrash myApp.crash myApp.app.dSYM > test.txt
(1).此時有可能出現Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 60.
這個時候只需要輸入export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer" 再重新執行命令就可以了
(2).除了以上可能出現的問題外,還有可能出現version不一致的問題,這是因爲.DYSM和.app文件與.crash文件不匹配的原因,需要version一致後才能正常運行
3.如果終端執行成功之後,在crash文件夾下會出現test.txt文件,這就是解析之後的文件
四、下面開始分析解析後的文件
打開test.txt文件,假如是這樣的:
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x30eaadfc __pthread_kill + 8
1 libsystem_pthread.dylib 0x30f28d33 pthread_kill + 59
2 libsystem_c.dylib 0x30e4a905 abort + 73
3 libc++abi.dylib 0x301899c5 abort_message + 85
4 libc++abi.dylib 0x301a0e25 std::__terminate(void (*)()) + 145
5 libc++abi.dylib 0x301a08ab __cxa_rethrow + 99
6 libobjc.A.dylib 0x30864dcf objc_exception_rethrow + 39
7 CoreFoundation 0x2309b6b9 CFRunLoopRunSpecific + 629
8 CoreFoundation 0x2309b42f CFRunLoopRunInMode + 103
9 GraphicsServices 0x2a40a0a5 GSEventRunModal + 133
10 UIKit 0x26686355 UIApplicationMain + 1437
11 myApp 0x00096e77 0x5c000 + 241271
12 libdyld.dylib 0x30de4aad start + 1
我們得到的是0x00096e77這個地址出現了crash。
然後我們執行命令dwarfdump --lookup 0x00096e77 -arch armv7 myApp.app.DSYM 就可以定位到crash的位置。
以後還會補充。