在ios崩潰日志中根據網上亂載的blog跳進的各種坑入坑1.xcode導出來的crash 里的Incident Identifier 與終端命令通過 dwarfdump --uuid ***.xcarchive/dSYMs/***.app.dSYM 得到的uuid不一致Incident Identifier對于每個崩潰文件都在變化。Incident Identifier事件標識符,標記某個事件的,so每次崩潰都會發生變化 這個做法獲取的uuid 是行不通入坑2.根據第三方平臺提供的崩潰日志找到了你的.xcarchive右擊“顯示包內容”---“dSYMs”-----“[你的appname].app.dSYM”---右擊"顯示包內容"---"Contents"-----"Resources"----"DWARF"。這時你會看到和你APPNAME一樣的文件,打開命令行輸入atos -o [拖動地址到這里] -l [16進制地址] -arch arm64 [16進制地址]。這個方式適用于從第三方平臺拿到崩潰日志,具體提到的兩個16進制地址是是第三方平臺提供的,而我就是不知道那兩個地址是怎么獲得的,況且我都有第三方平臺崩潰日志了,我還需要找什么bug位置定位嗎,人家已經給你展示出來崩潰代碼了so 這種方法我還需要用嗎,soso我也沒驗證。入坑3. 本著自己動手豐衣足食的態度,找api呀,各種找,感覺有道理,自己動手擼//用來做崩潰收集,在appdelegate中引入#importvoid calculate(void) { for (int i = 0; i < _dyld_image_count(); i++) { if (_dyld_get_image_header(i)->filetype == MH_EXECUTE) { char *image_name = (char *)_dyld_get_image_name(i); const struct mach_header *mh = _dyld_get_image_header(i); intptr_t vmaddr_slide = _dyld_get_image_vmaddr_slide(i); printf("Image name %s at load address 0x%llx and ASLR slide 0x%lx.\n", image_name, (mach_vm_address_t)mh, vmaddr_slide); break; } }}//在appdelegate方法里調用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //做崩潰收集 calculate();}拿到了耶;stackoverflow說是這樣:slide = _dyld_get_image_vmaddr_slide(0);load address = _dyld_get_image_header(0);symbol address = slide + stack address - load address;stack address 在crash log 中可以找到。用得到的symbol地址去 dsym 文件中 查詢,命令如下$dwarfdump --arch arm64 --lookup symbol address ***.app.dSYM/ 說是就可以定位下來具體的 代碼 函數名,所處的文件,行等信息了;就在我還沒搞明白這是怎么回事的時候,翻到了另一篇blog是這么說的符號地址symbol address = stack address - slide;我懵了,這兩方法是一回事嗎;開始驗證驗證呀,由于把之前的包刪掉了,沒法測,只好自己寫個bug讓它崩潰,之后做測試。。。。怎么想知道我的測試結果嗎,哈哈哈,我兩種方式都沒匹配上,郁悶了,需要大神指點一下是哪里出問題了!光明在此:找到https://github.com/answer-huang/dSYMTools 一個圖形化的崩潰診斷工具,它可以自動檢測到你mac里的.xcarchive文件,你可以選你需要的app版本,手機平臺arm64,默認就找到了uuid,但是需要偏移地址,光明要來了!確定dSYM、app以及crash文件的關系每一個xx.app, xxx.app.dSYM文件都擁有相應的uuid,crash文件也有uuid,只有三者uuid一至才表明之三者可以解析出正確的日志文件。1.查看 xx.app 文件的 UUID,terminal 中輸入命令 :dwarfdump --uuid xx.app/xx (xx代表你的項目名)//這個我沒試出來2.查看 xx.app.dSYM 文件的 UUID ,在 terminal 中輸入命令:dwarfdump --uuid xx.app.dSYM 3.crash 文件內 Binary Images: 下面一行中 <> 內的 e86bcc8875b230279c962186b80b466d 就是該 crash 文件的 UUID,而第一個地址 0x1000ac000 便是 slide address:Binary Images:0x1000ac000 - 0x100c13fff Example arm64/var/containers/Bundle/Application/99EE6ECE-4CEA-4ADD-AE8D-C4B498886D22/Example.app/Example
啦啦啦,就這么簡單輕松easy!