转载地址:http://blog.csdn.net/langresser/article/details/7403729

提取crash log的方法:

方法1:用工具直接获取 iPhone 设备上 /var/mobile/Library/Logs/CrashReporter  中的 Crash 报告文件。(Mac 下用 PhoneView/iTools/iExplorer,Windows下用、iFunBox、iTools、91助手等)。

方法2:如果 iTunes 同步,则同步后Crash日志会同步到电脑上,把以下目录中的Crash提取打包即可:
Mac OS X:~/Library/Logs/CrashReporter/MobileDevice
Windows XP:C:\Documents and Settings\Application Data\Apple computer\Logs\CrashReporter

Windows 7/Vista: C:\Users\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice/

分析log的方法:

你可以在文章中所提到的目录中找不到symbolicatecrash,因为它在新的SDK中被移到了这里:

/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/

DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash

大概说明一下是:

1.同步应用程序以后,找到你要查看的日志文件,日志文件对应mac的位置,xp\vista的位置.

2.发现日志文件都是看不懂的16进制,如何进行转换成我们看得懂的内容.

3.使用命令行工具 "symbolicatecrash"来进行转换,可以把 工具复制到任何地方都可以调用的路径:sudo cp/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash /usr/local/bin/

4.讲了 "symbolicatecrash" 工具怎么用.一般只要:symbolicatecrash report.crashMobileLines.app.dSYM > report-with-symbols.crash,就可以了

5.注意说明的是,你在用Xcode debug打包的时候,会生成两个东西,一个是XXX.app,另一个是XXX.app.dSYM,这两个是相对应的,与我写的第4点里的 MobileLines.app.dSYM是对应起来的.这里的日志文件必须是你打包的那个版本,不然就没有解析出你的日志文件了.通俗的说,你安装到手机上的app和这个dSYM,是配对的,如果你想要看这个手机上的日志文件,那你必须保存对应的dSYM文件去解析日志文件.每一次重新打包都会重新生成dSYM文件.

6.好了,你可以根据你的 report-with-symbols.crash,日志文件来看看你的程序哪里出问题了

Sometimes programs crash. This annoys users and developers alike. Users are frustrated because they cannot use crashing software, developers are frustrated because they have to hunt bugs instead of doing something creative and rewarding. How do we communicate if an iPhone application crashes?

I’ll start with a disclaimer. I’m not sure whether the information provided in this post is covered by iPhone Developer Program NDA or not. If it is, the post will be removed. Secondly, this post is a result of googling, so I haven’t invented anything new here.

Working with crash logs typically involves certain interaction between developers and users, unless they are automagically sent to the developer. First of all, the user should get the crash log and send it to the developer, who should examine it, find the bug and fix it.

iPhone OS and Mac OS X are remarkably similar architectures. Both store crash logs to help identify crashing bugs. The difference between the two is how users retrieve them. On Mac OS X every user has unrestricted access to crash logs related to the applications she runs. The iPhone does not even have a file browser. What to do? iTunes comes to the rescue.

Whenever you synchronize your iPhone or iPod Touch, all the crash logs are transferred to your computer. Here are their locations:

  • Mac OS X:~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
  • Windows XP:C:\Documents and Settings\<USERNAME>\Application Data\Apple computer\Logs\CrashReporter/<DEVICE_NAME>
  • Windows Vista:C:\Users\<USERNAME>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice/<DEVICE_NAME>

The log file names start with application name and have the extension “crash”. They are just plain text files and can be sent by e-mail in original or zipped form, or even copy-pasted into your e-mail program.

The second part is trickier. Both Apple and common sense suggest that all AppStore binaries are shipped with stripped symbols. If you ever saw a crash log like this, read on:

Thread 0 Crashed:0   libobjc.A.dylib           0x300c87ec 0x300bb000 + 552761   MobileLines               0x00006434 0x1000 + 215562   MobileLines               0x000064c2 0x1000 + 216983   UIKit                     0x30a740ac 0x30a54000 + 1312444   UIKit                     0x30a66110 0x30a54000 + 740005   UIKit                     0x30a6565c 0x30a54000 + 712606   GraphicsServices          0x3169b0b4 0x31696000 + 206607   GraphicsServices          0x3169d818 0x31696000 + 307448   IOMobileFramebuffer       0x31f3e8f8 0x31f3d000 + 63929   com.apple.framework.IOKit 0x30f342b8 0x30f30000 + 1708010  CoreFoundation            0x3025ced4 0x30229000 + 21269211  CoreFoundation            0x3025bed6 0x30229000 + 20859812  CoreFoundation            0x3025b584 0x30229000 + 20621213  GraphicsServices          0x316998e4 0x31696000 + 1456414  UIKit                     0x30a5e308 0x30a54000 + 4173615  UIKit                     0x30a671dc 0x30a54000 + 7830016  MobileLines               0x00002090 0x1000 + 424017  MobileLines               0x0000202c 0x1000 + 4140

In a nutshell, it contains function addresses and offsets instead of function names and line numbers. The structure is obvious, but, to be honest, I don’t know what“MobileLines 0×00006434 0×1000 + 21556″ is, even though I have all the source code. Thanks to Apple Developer Tools and to Craig Hockenberry whowrote about it, we have a perfect solution called symbolicatecrash.

I copied it to/usr/local/bin/so that I can run it whenever I want without trying to remember its original location (you may prefer a symbolic link):
$ sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash /usr/local/bin/

Running this script with the-h option provides the minimal help:

$ symbolicatecrash -h
usage:

symbolicatecrash [-Ah] LOGFILE [SYMBOL_PATH ...]

Symbolicates a crashdump LOGFILE which may be "-" to refer
  to stdin. By default, all heuristics will be employed
  in an attempt to symbolicate all addresses. Additional
  symbol files can be found under specified directories.

Options:
    -A  Only symbolicate the application, not libraries
    -h  Display this message
    -v  Verbose

To add symbols to the crash log you need the dSYM file generated by the linker when you compiled your application for AppStore. In other words, when you build for AppStore you should keep the dSYM package in a safe place backed up by Time Machine. This is very important.You should keep a copy of the dSYM for each version of your application ever shipped. If you have the package, translating code offsets to function names with line numbers has never been easier:

$ symbolicatecrash report.crash MobileLines.app.dSYM > report-with-symbols.crash

Here is the result:

Thread 0 Crashed:0   libobjc.A.dylib           0x300c87ec objc_msgSend + 201   MobileLines               0x00006434 -[BoardView setSelectedPiece:] (BoardView.m:321)2   MobileLines               0x000064c2 -[BoardView touchesBegan:withEvent:] (BoardView.m:349)3   UIKit                     0x30a740ac -[UIWindow sendEvent:] + 2644   UIKit                     0x30a66110 -[UIApplication sendEvent:] + 2485   UIKit                     0x30a6565c _UIApplicationHandleEvent + 40886   GraphicsServices          0x3169b0b4 PurpleEventCallback + 4287   GraphicsServices          0x3169d818 HeartbeatVBLCallback + 1528   IOMobileFramebuffer       0x31f3e8f8 IOMobileFramebufferNotifyFunc + 1249   com.apple.framework.IOKit 0x30f342b8 IODispatchCalloutFromCFMessage + 30410  CoreFoundation            0x3025ced4 __CFMachPortPerform + 7211  CoreFoundation            0x3025bed6 CFRunLoopRunSpecific + 236412  CoreFoundation            0x3025b584 CFRunLoopRunInMode + 4413  GraphicsServices          0x316998e4 GSEventRunModal + 26814  UIKit                     0x30a5e308 -[UIApplication _run] + 40415  UIKit                     0x30a671dc UIApplicationMain + 106416  MobileLines               0x00002090 main (main.m:16)17  MobileLines               0x0000202c start + 44

Now, this ismuch better. Happy debugging!

Other useful references:

gdb查看:

如果采用上述方法还是解析不出来,则可以利用gdb来解析:

方法如下:还是在.app,和.dSYM目录下,

打开终端,输入:

/Developer/Platforms/iPhoneOS.platform/Developer/usr/libexec/gdb/gdb-arm-apple-darwin 打包的.app/MyApp

要想显示在哪个类,哪一行,则使用:

(gdb)  set print symbol-filename on

(gdb) p/a 0x0002b0ee

这里0x0002b0ee 是你报错程序的错误,如:

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                   0x34bc8c9a objc_msgSend + 18
1   UIKit                             0x34309146 -[UIViewController didReceiveMemoryWarning] + 10
2   UIKit                             0x3430915c -[UIViewController _didReceiveMemoryWarning:] + 8
3   Foundation                        0x36b7d17c _nsnote_callback + 136
4   CoreFoundation                    0x355bb208 __CFXNotificationPost_old + 396
5   CoreFoundation                    0x35555ee4 _CFXNotificationPostNotification + 112
6   Foundation                        0x36b7a5cc -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
7   Foundation                        0x36b7c1ba -[NSNotificationCenter postNotificationName:object:] + 18
8   UIKit                             0x342df35a -[UIApplication _performMemoryWarning] + 42
9   UIKit                             0x342dfd7c -[UIApplication _receivedMemoryNotification] + 120
10  UIKit                             0x342dd500 _memoryStatusChanged + 36
11  CoreFoundation                    0x355bbd62 __CFNotificationCenterDarwinCallBack + 18
12  CoreFoundation                    0x355b8bd8 __CFMachPortPerform + 204
13  CoreFoundation                    0x355c3a90 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
14  CoreFoundation                    0x355c5838 __CFRunLoopDoSource1 + 160
15  CoreFoundation                    0x355c6606 __CFRunLoopRun + 514
16  CoreFoundation                    0x35556ebc CFRunLoopRunSpecific + 224
17  CoreFoundation                    0x35556dc4 CFRunLoopRunInMode + 52
18  GraphicsServices                  0x3417d418 GSEventRunModal + 108
19  GraphicsServices                  0x3417d4c4 GSEventRun + 56
20  UIKit                             0x341b4d62 -[UIApplication _run] + 398
21  UIKit                             0x341b2800 UIApplicationMain + 664
22  PABankiPad                        0x00002618 0x1000 + 5656
23  PABankiPad                        0x000025cc 0x1000 + 5580

这里,可以用:p/a 0x00002618

查看.app,和.dSYM与崩溃日志是否一致的方法:

输入命令:

dwarfdump ‐‐uuid MyApp.app/MyApp

返回内容:

UUID: E2D9D241‐37D3‐CE06‐7272‐653B813963E2 (armv6) MyApp.app/MyApp

输入命令:

dwarfdump ‐‐uuid MyApp.app.dSYM

返回内容

UUID: E2D9D241‐37D3‐CE06‐7272‐653B813963E2 (armv6)MyApp.app.dSYM/Contents/Resources/DWARF/MyApp

对比结果是否一致.

把命令链接到所有用户可以使用

sudo ln -s /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash /usr/local/bin/

sudo ln -s  /Developer/Platforms/iPhoneOS.platform/Developer/usr/libexec/gdb/gdb-arm-apple-darwin/usr/local/bin/

批量转换日志:(app包和dSYM还有carsh文件都放到对应的目录下了)

cd ~/Desktop/a1201s4z1.5c
pwd
k=1
for i in *.crash;do
        echo $i
        symbolicatecrash $i PABankiPad.app.dSYM > $k.log
        ((k++))
done

除上述方法外,还可以使用如下命令通过地址解析函数名:

使用命令:atos -o xxx.app/xxx -arch armv7 0x38ad42f9 0x38ad42f9 0x38ad42f9(多个16进制地址,使用空格分开)

注意.app, .app.dSYM需要跟日志程序版本build一致

ios设备的Crash Log提取及分析方法相关推荐

  1. iOS 几种常用的 crash log 崩溃信息调试方法. (转载)

    前言:crash log 对 定位崩溃问题 ,并且不容易复现,尤其是及时对appstore 上正在运营的 app 的迭代改进来说 非常重要. 1 crash两种情况 1.1 测试环境下 追踪bug 1 ...

  2. iOS 几种常用的 crash log 崩溃信息调试方法

    前言:crash log 对 定位崩溃问题 ,并且不容易复现,尤其是及时对appstore 上正在运营的 app 的迭代改进来说 非常重要. 1 crash两种情况 1.1 测试环境下 追踪bug 1 ...

  3. iOS-几种常用的 crash log 崩溃信息调试方法

    前言:crash log 对 定位崩溃问题 ,并且不容易复现,尤其是及时对appstore 上正在运营的 app 的迭代改进来说 非常重要. 1 crash两种情况 1.1 测试环境下 追踪bug 1 ...

  4. ios wifi 定位_一种IOS设备的集中式Wifi室内定位方法

    一种IOS设备的集中式Wifi室内定位方法 [技术领域] [0001] 本发明属于无线通信室内定位技术领域,具体涉及一种IOS设备的集中式Wifi室 内定位方法. [背景技术] [0002] 近年来, ...

  5. IOS反汇编工具Hopper分析Crash Log

    2019独角兽企业重金招聘Python工程师标准>>> 在Mac OS下分析Crash Log有很多种方法,这里不是要说明如何分析的Crash Log, 主要是展示下Hopper的使 ...

  6. 深入理解iOS Crash Log

    Crash Log Crash Log的主要来源有两种: Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载 三方或者自研Framework统计,三方服务 ...

  7. 了解设备健康报表的关键指标与分析方法

    在现代工业领域中,设备健康报表是一项关键工具,通过收集和分析设备的运行数据,它提供了关于设备状态和性能的重要指标.设备健康报表对于企业的设备管理和维护决策至关重要.本文将介绍设备健康报表的关键指标,并 ...

  8. 处理、分析iOS App的Crash Reports

    分析Crash report Apple的官方文档:Understanding and Analyzing iOS Application Crash Reports iOS设备上,当app崩溃时会创 ...

  9. CSR867x — IOS设备搜索到的BLE外设名称与实际名称不相符的问题分析

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX  作       者:文化人 XX  联系方式:(或进群:471144274联系我) ...

最新文章

  1. 多版本号并发控制(MVCC)在分布式系统中的应用
  2. 移动端、PC端网站优化需齐头并进
  3. JavaScript是如何工作的:JavaScript的共享传递和按值传递
  4. 热点聚焦:精益生产模式的最大优势在哪?
  5. c# 编写自定义异常类
  6. boost::signals2模块实现多线程信号调用基准的测试程序
  7. 中国石油计算机文化基础答案,中国石油大学17年秋《计算机文化基础》第二次在线作业答案...
  8. 不想做程序员了,想哭
  9. Codeforces Round #162 (Div. 2): D. Good Sequences(DP)
  10. 笨方法python3_“笨方法”学Python3,习题 30 。
  11. 基于P2P终结者的ARP攻击实践(截取数据获取上网账号密码)
  12. 产品经理如何搭建自己的知识地图?
  13. VMware虚拟机安装Centos 8系统的详细操作步骤
  14. 【远距离无线模块】WDS3及SI4338使用步骤及配置说明
  15. ThinkPad T480不拆电脑后盖更换键盘
  16. mysql lob 操作_Oracle中LOB 处理
  17. 游戏引擎架构-学习笔记
  18. 网络数据保障ptop_网络影响未来十大预言 宽带应用将与新媒体融合
  19. 键盘修改器,绝对管用
  20. 熟悉FreeSWITCH 一

热门文章

  1. Outlook2007备份的方法
  2. 主流测绘数据国内外现状
  3. web系统私有化部署方案
  4. node-sass安装失败、报错、解决办法总结
  5. 华为应急通讯 迅驰C2 新版双网 原版GSMS软件六合一套装U盘版 ISO文件 百度网盘下载
  6. esp8266连接中智云平台
  7. Ubuntu13.04(64bit)下用Wine安装百度云、360云、微云
  8. Python批量处理文件、图片、视频【干货建议收藏】
  9. 【开发日常】【Java】Java小程序动物乐园zoo
  10. 使用Java对返回的结果,封装成指定JSON格式的数据类型