当前位置: 首页 > >

OSX app (Mac app) crash 文件分析与定位

发布时间:

?0. 假设我们的程序名叫 XXXX, 内置了第三方crash报告的工具(或通过apple的 crash report机制),上架后的程序crash了能及时拿到crash report ,且app上架时通过xcode生成的archive包没有被删掉。


1. 拿到crash report, 查看crash线程的调用堆栈,找出直接跟我们程序相关的函数地址,如下图 标红部分,其他地址皆为系统库中的函数。则第 36个函数是我们需要定位出函数名称的crash函数,其基址为0x100262000,偏移值为2491306.


......



34 AppKit 0x00007fff8f585374 __35-[NSApplication runModalForWindow:]_block_invoke + 64
35 AppKit 0x00007fff8f3a2b98 -[NSApplication runModalForWindow:] + 137
36 XXXX 0x00000001004c23aa 0x100262000 + 2491306

。。。。。



58 AppKit 0x00007fff8f1433db -[NSApplication run] + 926
59 AppKit 0x00007fff8f10de0e NSApplicationMain + 1237
60 XXXX 0x00000001004c0ae9 0x100262000 + 2484969
61 libdyld.dylib 0x00007fffa6dd5235 start + 1





2. 打开 app和符号文件所在目录,可通过 Xcode 》window 》Organizer 》Archives 选择archive,右键 “Show in folder” ,


? 右键 “显示包内容” ,进入 ?Products 》Applications 》XXXX 》Contents 》MacOS ,并将 dSYMs 》XXXX.app.dSYM 也拷贝到此目录




3, 打开终端并定位到以上目录


? > lldb XXXX



(lldb) add-dsym XXXX.app.dSYM



(lldb)?image lookup -n main


? ? 一般返回结果的第一个条目 即为主程序的main函数,复制其地址,如下标红处 ,此地址即对应了 1)中 主线程堆栈中倒数第2个函数


?


? ? ? ? Address: XXXX[0x000000010025eaa0] (XXXX.__TEXT.__text + 2476784)


? ? ? ? Summary: XXXX`main at AppDelegate.swift




4,通过1)中的偏移值计算 crash函数在image中对应的地址


? ?


(lldb) po 0x000000010025eaa0 - 2484969


4294967223




这个 地址即为我们主程序函数地址的基址。


根据此地址加上偏移值计算 crash函数 在image中的地址。





(lldb) po 4294967223 + 2491306


4297458529




5,反查这个地址对应的符号名和所在文件





(lldb) image lookup -a 4297458529


? ? ? Address: XXXX[0x0000000100260361] (XXXX.__TEXT.__text + 2483121)


? ? ? Summary: XXXX`function signature specialization of XXXX.AppDelegate.onCallSettings (Swift.AnyObject) -> () + 417 [inlined] static XXXX.AppDelegate.showSettingsWindow (XXXX.SettingsTabID) -> () + 22 at AppDelegate.swift:108


? ? ? ? ? ? ? ?XXXX`function signature specialization of XXXX.AppDelegate.onCallSettings (Swift.AnyObject) -> () + 395 at AppDelegate.swift:108




至此,真相大白,AppDelegate.swift 第108行 出错了。









友情链接: