当前位置: 首页 > 编程日记 > 正文

ios bug 分析

ios中线上或者内部测试bug统计收集有两种方法:

1)使用第三方bug收集

1.bugHD

来源http://bughd.com/doc/ios-customize

2.bugtags

来源http://help.bugtags.com/hc/kb/article/124400/

http://help.bugtags.com/hc/kb/article/68482/

3.KSCrash

https://github.com/kstenerud/KSCrash

4.友盟

主要不要多种一起使用,使用多个崩溃收集第三方会导致NSSetUncaughtExceptionHandler()函数指针的恶意覆盖,导致有些第三方不能收到崩溃信息

2)自己搭建后台收集bug

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);return YES;
}void UncaughtExceptionHandler(NSException *exception) {/***  获取异常崩溃信息*/NSArray *callStack = [exception callStackSymbols];NSString *reason = [exception reason];NSString *name = [exception name];NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]];/***  把异常崩溃信息发送至开发者邮件*/NSMutableString *mailUrl = [NSMutableString string];[mailUrl appendString:@"mailto:test@qq.com"];[mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"];[mailUrl appendFormat:@"&body=%@", content];// 打开地址NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}
NSSetUncaughtExceptionHandler只能监听NSException类型的异常,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误就无能为力了。因为这种错误它抛出的是Signal,
所以必须要专门做Signal处理, 可以参考如下封装;测试时,可以调用abort()函数,模拟发送SIGABRT信号,不要联机测试,要脱机测试。

参考:http://www.cnblogs.com/easonoutlook/archive/2012/12/27/2835979.html

http://blog.csdn.net/qianlima210210/article/details/51226087

https://github.com/easonoutlook/UncaughtExceptionHandler

从iOS设备导出的bug日志大概是这样的:

// 1.进程信息Incident Identifier: 4CBF22C2-3E92-434B-B5DF-C35CF670B007
CrashReporter Key:   1a0da8d4b693f98613cf29e3a42e503ffa91d9fb
Hardware Model:      iPhone7,2
Process:             ********** [1895]
Path:                /private/var/containers/Bundle/Application/1096962B-8F33-4BA5-8101-C733C98D3E2F/**********.app/**********
Identifier:          **********
Version:             21500 (2.1.5)
Code Type:           ARM-64 (Native)
Parent Process:      launchd [1]// 2.基本信息
Date/Time:           2017-03-02 09:59:59.59 +0800
Launch Time:         2017-03-02 09:59:59.59 +0800
OS Version:          iOS 9.3.2 (13F69)
Report Version:      105// 3.异常信息
Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0Filtered syslog:
None foundLast Exception Backtrace:
0   CoreFoundation                    0x182df6db0 __exceptionPreprocess + 124
1   libobjc.A.dylib                   0x18245bf80 objc_exception_throw + 56
2   CoreFoundation                    0x182cda708 -[__NSArrayM insertObject:atIndex:] + 808
3   ***************         0x100123c50 -[AppDelegate application:didFinishLaunchingWithOptions:] (AppDelegate.m:49)
4   UIKit                             0x187fca9c0 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 400
5   UIKit                             0x1881fa184 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 2904
6   UIKit                             0x1881fe5f0 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1684
7   UIKit                             0x1881fb764 -[UIApplication workspaceDidEndTransaction:] + 168
8   FrontBoardServices                0x1847977ac __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 36
9   FrontBoardServices                0x184797618 -[FBSSerialQueue _performNext] + 168
10  FrontBoardServices                0x1847979c8 -[FBSSerialQueue _performNextFromRunLoopSource] + 56
11  CoreFoundation                    0x182dad09c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
12  CoreFoundation                    0x182dacb30 __CFRunLoopDoSources0 + 540
13  CoreFoundation                    0x182daa830 __CFRunLoopRun + 724
14  CoreFoundation                    0x182cd4c50 CFRunLoopRunSpecific + 384
15  UIKit                             0x187fc394c -[UIApplication _run] + 460
16  UIKit                             0x187fbe088 UIApplicationMain + 204
17  ***************         0x10017a5ec main (main.m:14)
18  libdyld.dylib                     0x1828728b8 start + 4Global Trace Buffer (reverse chronological seconds):
6148914688.535940 CFNetwork                     0x000000018347bf18 TCP Conn 0x12dd91c60 complete. fd: 8, err: 0
6148914688.536304 CFNetwork                     0x000000018347d444 TCP Conn 0x12dd91c60 event 1. err: 0
6148914688.549507 CFNetwork                     0x000000018347d51c TCP Conn 0x12dd91c60 started
6148914688.550894 CFNetwork                     0x00000001834d7e5c Creating default cookie storage with default identifier
6148914688.550894 CFNetwork                     0x00000001834d7e28 Faulting in CFHTTPCookieStorage singleton
6148914688.550894 CFNetwork                     0x0000000183529e50 Faulting in NSHTTPCookieStorage singleton// 4.线程回调
Thread 0 name:  Dispatch queue: com.apple.main-thread// 5.线程状态
Thread 0 Crashed:
0   libsystem_kernel.dylib            0x000000018299011c __pthread_kill + 8
1   libsystem_pthread.dylib           0x0000000182a5cef8 pthread_kill + 112
2   libsystem_c.dylib                 0x0000000182901dac abort + 140
3   libc++abi.dylib                   0x00000001824353f4 __cxa_bad_cast + 0
4   libc++abi.dylib                   0x0000000182451e98 default_unexpected_handler() + 0
5   libobjc.A.dylib                   0x000000018245c248 _objc_terminate() + 124
6   libc++abi.dylib                   0x000000018244ef44 std::__terminate(void (*)()) + 16
7   libc++abi.dylib                   0x000000018244eb10 __cxa_rethrow + 144
8   libobjc.A.dylib                   0x000000018245c120 objc_exception_rethrow + 44
9   CoreFoundation                    0x0000000182cd4cf8 CFRunLoopRunSpecific + 552
10  UIKit                             0x0000000187fc394c -[UIApplication _run] + 460
11  UIKit                             0x0000000187fbe088 UIApplicationMain + 204
12  ***********************         0x000000010017a5ec main (main.m:14)
13  libdyld.dylib                     0x00000001828728b8 start + 4Thread 1 name:  Dispatch queue: NSOperationQueue 0x12dd6d5e0 :: NSOperation 0x12ded4110 (QOS: LEGACY)
Thread 1:
0   libsystem_kernel.dylib            0x000000018298f140 __bsdthread_ctl + 8
1   libsystem_pthread.dylib           0x0000000182a5eb10 _pthread_set_properties_self + 64
2   Foundation                        0x00000001837b2b20 iop_set_pthread + 200
3   Foundation                        0x00000001837b2890 __NSOQSchedule_f + 60// 6.二进制映像
Binary Images:
0x100088000 - 0x1002d7fff *********************** arm64  <da83a4ffedd937bd93e8313b34363457> /var/containers/Bundle/Application/1096962B-8F33-4BA5-8101-C733C98D3E2F/***********************.app/***********************
0x100630000 - 0x100657fff MagicalRecord arm64  <6bcc1202aef333e5b1c7c62443f57b2a> /var/containers/Bundle/Application/1096962B-8F33-4BA5-8101-C733C98D3E2F/***********************.app/Frameworks/MagicalRecord.framework/MagicalRecord
(1) 进程信息
第一部分是闪退进程的相关信息。
Incident Identifier是崩溃报告的唯一标识符。
CrashReporter Key 是与设备标识相对应的唯一键值。虽然它不是真正的设备标识符,但也是一个非常有用的情报:如果你看到100个崩溃日志的CrashReporter Key值都是相同的,或者只有少数几个不同的CrashReport值,说明这不是一个普遍的问题,只发生在一个或少数几个设备上。
Hardware Model 标识设备类型。 如果很多崩溃日志都是来自相同的设备类型,说明应用只在某特定类型的设备上有问题。上面的日志里,崩溃日志产生的设备是iPhone 4s。
Process 是应用名称。中括号里面的数字是闪退时应用的进程ID。
(2) 基本信息
这部分给出了一些基本信息,包括闪退发生的日期和时间,设备的iOS版本。如果有很多崩溃日志都来自iOS 6.0,说明问题只发生在iOS 6.0上。
(3) 异常
在这部分,你可以看到闪退发生时抛出的异常类型。还能看到异常编码和抛出异常的线程。根据崩溃报告类型的不同,在这部分你还能看到一些另外的信息。
(4) 线程回溯
这部分提供应用中所有线程的回溯日志。 回溯是闪退发生时所有活动帧清单。它包含闪退发生时调用函数的清单。
2       XXALib      0x24243124    0x82000 + 9383
帧编号    库名          调用方法地址     指向文件  + 文件中的代码行
(5) 线程状态
这部分是闪退时寄存器中的值。一般不需要这部分的信息,因为回溯部分的信息已经足够让你找出问题所在。
(6) 二进制映像
这部分列出了闪退时已经加载的二进制文件。
每次项目编译后的.dSYM文件都有可能不一样,xx.app、xx.app.dSYM、xx.crash三者文件的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 文件内第一行 Incident Identifier 就是该 crash 文件的 UUID。

.crash文件的分析

a.配置环境变量DEVELOPER_DIR
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
b.输出bug信息
symbo xx.crash xx.dSYM ->bug.txt


参考:http://www.cocoachina.com/ios/20141219/10694.html
https://github.com/answer-huang/dSYMTools

相关文章:

我理解的接口测试(一)

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口 应用&#xff08;模块&#xff09;提供对…

android jni语法,Android NDK中的JNIEXPORT和JNICALL

基本上是一个Windows问题,如果你看看oracle Java jdk附带的文件jni_md_win32.h这是宏定义&#xff1a;/** (#)jni_md.h 1.14 03/12/19** Copyright 2004 Sun Microsystems, Inc. All rights reserved.* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.*/#ifnd…

Win7编译volley成jar包

首先安装git和ant&#xff0c;当然jdk也是必须的。 git clone搞到volley的源码。 git clone https://android.googlesource.com/platform/frameworks/volley 此时volley的目录里面应该是这样的&#xff0c;没有AndroidManifest.xml文件。 cd进volley目录&#xff0c;敲下一…

c语言的求素数算法,C语言求素数的算法

最后一次是出了素数的问题C语言解决题目(面试)&#xff0c;当时用了最粗暴的算法。回来细致參考资料&#xff0c;事实上答案有非常多种&#xff1a;1&#xff0c;小学生版本号&#xff1a;推断 x 是否为质数&#xff0c;就从 2 一直算到 x-1。static rt_uint32_t array1[ARRAY_…

Python全栈Day 15部分知识点

全局变量与局部变量 约定俗成的规则&#xff1a;全局变量名大写&#xff0c;局部变量名小写。 全局变量没有缩进&#xff0c;顶格写。 如果函数的内容无global关键字&#xff0c;优先读取局部变量&#xff0c;能读取全局变量&#xff0c;无法重新赋值&#xff0c;但是对于可变类…

SQL执行并返回执行前/后结果

SQLServer&#xff1a; 1、插入数据&#xff0c;并返回插入的数据&#xff1a;INSERT INTO TestTB(Province,City) output inserted.Province, inserted.City VALUES(广东,深圳)2、同理&#xff0c;删除数据也是一样的&#xff0c;只不过是使用deleted表罢了。delete from Test…

WebStorm 运行Rect Native 项目

今天教大家如何直接使用WebStorm这个IDE直接完成编码运行项目工作.这样就可以不用打开Xcode了. 1.首先点击WebStorm右上方的下拉箭头弹出的Edit Configurations.... 2.然后会进入一个配置页面.点击左上方的.在弹出的列表中选中npm.如图. 3.在右边的配置框中,先选择Command为hel…

Win7下用VS2010编译QGIS2.9.0

折腾了两天了&#xff0c;终于吧QGIS2.9.0在VS2010下面编译过了。 参考了许多的博客&#xff0c;在网络环境极为和&#xff08;e&#xff09;谐&#xff08;lie&#xff09;的情况下用Google查了好多资料。 其实原创的东西真的不多&#xff0c;但是毕竟是自己亲身实践得到的成…

软件工程第二次课后作业——Gaoooo

代码量&#xff1a;9行 码云仓库&#xff1a;https://gitee.com/Gaooo/2016035107059.git 实现时间&#xff1a;emmmmm&#xff08;9行代码&#xff0c;自己估计&#xff01;&#xff01;&#xff09; 程序对表达式类型的支持程度&#xff1a;全部支持&#xff01; 能支持两个操…

android检测本地是否安装,在本地测试模块的安装

Play 核心库可让您在本地测试应用是否能够执行以下操作&#xff0c;而无需连接到 Play 商店&#xff1a;请求并监控模块的安装。处理安装错误。本页介绍了如何将应用的拆分 APK 部署到测试设备&#xff0c;以便 Play 核心自动使用这些 APK 模拟从 Play 商店请求、下载和安装模块…

IsPostBack的使用

protected void Page_Load(object sender, EventArgs e){//当前用户通过Index.aspx页面中“添加用户”链接跳转到该页面时&#xff0c;这是一次get请求&#xff0c;所以不会提交表单&#xff0c;拿不到隐藏域的值。当前页面显示完成&#xff0c;用户在表单中输入数据以后单击提…

WebStorm下ReactNative代码提示设置

ReactNative 代码智能提醒 (Webstrom live template) https://github.com/virtoolswebplayer/ReactNative-LiveTemplate ReactNative的代码模板,包括: 1.组件名称 2.Api 名称 3.所有StyleSheets属性 4.React组件 安装 方法一 file -> import settings -> ReactNative.ja…

WinXp安装Oracle 11g Express Edition

由于在虚拟机上学习&#xff08;怕把真机器搞坏了&#xff09;&#xff0c;这次是在Windows XP上安装Oracle 11g Express。 本文安装的是Oracle 11g Express&#xff0c;是Oracle数据库的快速版&#xff08;学习版&#xff09;&#xff0c;安装包大小只有几百MB。 到Oracle的…

html语言书写注意事项,CSS命名规范参考及书写注意事项

CSS书写顺序*{/*显示属性*/displaypositionfloatclearcursor…/*盒模型*/marginpaddingwidthheight/*排版*/vertical-alignwhite-spacetext-decorationtext-align…/*文字*/colorfontcontent/*边框背景 为什么要把 boder和background放在最后的原因是修改的频率会较之前的频繁&…

关于移动端rem适配

var num 1 / window.devicePixelRatio; var fontSize document.documentElement.clientWidth / 10; document.getElementsByTagName(html)[0].style.fontSize fontSize px; 适配移动端rem单位&#xff0c;实际使用的时候用量取到的像素值/75即为计算后的rem值&#xff0c;标…

JavaWeb基础—JSP

一、什么是JSP JSP 全称是 Java Server Pages&#xff0c;是一种开发动态web资源的技术 在原HTML上添加JAVA脚本&#xff08;灵魂工程师&#xff0c;为页面添加灵魂&#xff09;&#xff0c;可以说 jsp html java代码 jsp标签 二、JSP的原理 JSP基本原理&#xff1a; JSP…

react-native 常用命令

创建项目 react-native init AwesomeProject //AwesomeProject是项目名启动 Node.js web server react-native start启动android react-native run-android启动ios react-native run-ios运行特定模拟器&#xff1a;react-native run-ios --simulator "iPhone 5"

使用WinPcap和libpcap类库读写pcap文件(001)开发环境配置

最近的项目要求写一个读写pcap文件的小程序&#xff0c;用来修改pcap中的部分信息&#xff0c;实现pcap的定制。 所以必须学会使用wireshark并能有利用WinPcap库和libpcap库进行开发。 虽然本文记录的都是windows下使用WinPcap进行开发&#xff0c;但是由于希望程序能够跨平台…

MySql忘记密码了咋办

对内 忘记密码终端修改操作&#xff1a; #停止mysql服务 sudo /opt/lampp/lampp stopmysql #参数启动mysqld sudo /opt/lampp/sbin/mysqld --skip-grant-tables #新建开一个终端&#xff08;复制会话&#xff09;进入 sudo /opt/lampp/bin/mysql -uroot #使用mysql权限&…

html资源文件记载进度条,用进度条显示文件读取进度《 HTML5:文件 API 》

在这个文档里&#xff0c;我添加了一个 标签 .. 上面定义了一个 ID 是 eventstatus … 我们可以把进度条放在这个容器里面 … 先找到用来显示进度条的容器 …// 找到显示事件状态的容器var eventStatus document.getElementById("eventstatus");然后再去创建进度条需…

JS中根据某个值进行大小排序

//从大到小排序 function compareBigToSmall(property){return function(a,b){var value1 a[property];var value2 b[property];return value2 - value1;} }; //从小到大排序 function compareSmallToBig(property){return function(a,b){var value1 a[property];var value…

react native 常用学习或查资料网址

react-native facebook官网&#xff1a;http://facebook.github.io/react-native/ 中文网&#xff1a;http://reactnative.cn/ react 官网地址&#xff1a;http://facebook.github.io/react/ Github地址&#xff1a;https://github.com/facebook/react 阮一峰教程&#xff1a…

使用WinPcap和libpcap类库读写pcap文件(002)PCAP文件格式

本文基本翻译自https://wiki.wireshark.org/Development/LibpcapFileFormat&#xff0c;主要分析pcap文件的格式。 其中一些字段可能和现在的WinPcap类库里的字段不同&#xff0c;请结合当前WinPcap库分析。 libpcap文件格式 libpcap文件格式是TcpDump/WinDump&#xff0c;Wir…

图论-最短路径--3、SPFA算法O(kE)

SPFA算法O(kE) 主要思想是&#xff1a; 初始时将起点加入队列。每次从队列中取出一个元素&#xff0c;并对所有与它相邻的点进行修改&#xff0c;若某个相邻的点修改成功&#xff0c;则将其入队。直到队列为空时算法结束。 这个算法&#xff0c;简单的说就是队列优化的bellman-…

如何在HHDI中进行数据质量探查并获取数据剖析报告

通过执行多种数据剖析规则&#xff0c;对目标表&#xff08;或一段SQL语句&#xff09;进行数据质量探查&#xff0c;从而得到其数据质量情况。目前支持以下几种数据剖析类型&#xff0c;分别是&#xff1a;数字值分析、值匹配检查、字符值分析、日期值分析、布尔值分析、重复值…

html5网页怎么实现内容追加,纯js实现网页内容复制后自动追加自定义内容

网页操作内容复制内容后纯js实现监听自动追加自定义内容不少网站技术或者博客上有这样的处理&#xff0c;当我们复制代码的时候&#xff0c;会自动加上一段本信息版权为XXXX&#xff0c;这是怎么实现的呢&#xff1f;其实实现的方式很简单&#xff0c;可以在我的网站页面上绑定…

ios Standard Framework和Umbrella Framework

Standard Framework&#xff1a;标准库&#xff0c;通过引用对应的header文件而不是引用master header 文件来引用类(也可以通过引用Master Header file来引用需要使用的类)&#xff0c;只需要暴露对应的header文件到Header文件夹下即可&#xff0c;不强制引用master header文件…

Win7使用Visual Studio 2010编译用于Qt4.8.6的MySQL驱动

其实编译过程在Qt Creator 的帮助文档里有&#xff0c;我就是照着做的&#xff0c;但是没成功&#xff0c;因为不能照搬照抄&#xff01; 1.确保path环境变量里有QTDIR&#xff0c;这个就不细说了。 2.打开"开始"->"Microsoft Visual Studio 2010"->…

ios 常见性能优化

1. 用ARC管理内存 2. 在正确的地方使用reuseIdentifier 3. 尽可能使Views透明 4. 避免庞大的XIB 5. 不要block主线程 6. 在Image Views中调整图片大小 7. 选择正确的Collection 8. 打开gzip压缩 9. 重用和延迟加载Views 10. Cache, Cache, 还是Cache&#xff01; 11. 权衡渲染方…

强化学习(七)时序差分离线控制算法Q-Learning

在强化学习&#xff08;六&#xff09;时序差分在线控制算法SARSA中我们讨论了时序差分的在线控制算法SARSA&#xff0c;而另一类时序差分的离线控制算法还没有讨论&#xff0c;因此本文我们关注于时序差分离线控制算法&#xff0c;主要是经典的Q-Learning算法。 Q-Learning这一…