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

来源:互联网 发布:ubuntu内核 编辑:程序博客网 时间:2024/06/06 01:25

 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 + 6435  AppKit                               0x00007fff8f3a2b98 -[NSApplication runModalForWindow:] + 13736  XXXX                                 0x00000001004c23aa 0x100262000 + 2491306
。。。。。

58  AppKit                               0x00007fff8f1433db -[NSApplication run] + 92659  AppKit                               0x00007fff8f10de0e NSApplicationMain + 123760  XXXX                                 0x00000001004c0ae9 0x100262000 + 248496961  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 <Arg[0] = Dead and Owned To Guaranteed, Arg[1] = Dead> of XXXX.AppDelegate.onCallSettings (Swift.AnyObject) -> () + 417 [inlined] static XXXX.AppDelegate.showSettingsWindow (XXXX.SettingsTabID) -> () + 22 at AppDelegate.swift:108

               XXXX`function signature specialization <Arg[0] = Dead and Owned To Guaranteed, Arg[1] = Dead> of XXXX.AppDelegate.onCallSettings (Swift.AnyObject) -> () + 395 at AppDelegate.swift:108


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




原创粉丝点击