关于 iOS 程序调试 及腾讯 Bugly 的演练
2016-11-10 18:45
183 查看
程序调试
● 调用堆栈
我们先写一个 Demo 演示一下错误
运行后 程序很听话的报错了!
我们来看一下错误信息
通常程序崩溃后 我们的目光会聚焦在错误信息的最上方部分 如下:
通常看到这里我们就开始想,程序到底哪错了,到底在哪里插入空对象了
然后就开始满世界的去找,试想我们一个项目中有成百上千个文件,我们这样找要找到什么时候
那我们如何找到更详细的信息呢?
在我们聚焦的错误信息的下方就是程序错误的详细信息
它有一个专用名词 调用堆栈
调用堆栈先执行的步骤在下方 后执行的步骤在上方
那调用堆栈给我们哪些详细的信息呢
再往后程序就崩溃了 我们通过上面的信息就可以定位到 testDemo 这个函数出问题了
错误原因既是 我们向数组[1]中添加一个空对象
发现这个线索之后 我们可以就直接去 ViewController 中 找到 testDemo 发现
所以我们一定要学会调用堆栈的技巧 只有善于使用这个技巧 我们才能更快的调试错误信息
● 收集错误信息
那我们在真机测试时同样的错误提示的错误信息是什么呢?
![](http://upload-images.jianshu.io/upload_images/3077591-5299c503<br/>ab76<br/>09a0d802.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如图所示 在真机测试时只显示错误信息,不显示详细的调用堆栈的内容
那程序上线后,我们如何收集错误信息呢?
这时候我们就需要使用到第三方的框架 * Bugly *
**官方网站: https://bugly.qq.com/v2/
登录 QQ 后 如下图
![](http://upload-images.jianshu.io/upload_images/3077591-5b4021d3f82f6f50.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
进入后我们注册一下
![](http://upload-images.jianshu.io/upload_images/3077591-c2990ce3abd28137.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
注册完成后 我们来集成 第三方框架 选中 SDK -> iOS SDK 使用指南
![](http://upload-images.jianshu.io/upload_images/3077591-76d47370879d772e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在这里我推荐使用 CocoaPods 集成 Bugly 框架
打开Mac自带终端
建立 Podfile
将项目中 Podfile 拖入 Xcode 中
不要删除文件中的内容
在 target 下方 粘贴 如下内容
回到终端中
Tip: 我们可以通过
接下来我们回到项目中 这时候记得点 白色 的文件
来到项目的 AppDelegate.m 中初始化 Bugly
此处的 AppID 在我们刚刚注册的 App 中 如下图:
![](http://upload-images.jianshu.io/upload_images/3077591-03cae1fdc99262ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
替换 AppID 后 我们导入框架的工作就完成了!
此时我们回到项目中运行程序 真机测试 继续让程序崩溃下~
崩溃后 稍等片刻回到 网站中查看崩溃日志
这里注意: 程序崩溃后 会在 AppDelegate.h 中打一个 断点**
此时后面的程序就不会继续执行 不执行就会导致错误信息无法提交到 Bugly 中
从而导致我们在崩溃日志中 无法显示崩溃结果
此时 我们回到手机中 点击实例程序 闪退即可**
![](http://upload-images.jianshu.io/upload_images/3077591-0d2c57e3191bcb45.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
点击进入 错误信息
![](http://upload-images.jianshu.io/upload_images/3077591-22db93d36daa0728.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
与我们在模拟器中 调用堆栈 的内容一致 ,并且它还帮我们将错误信息 标蓝
末语:
当我们导入腾讯的第三方框架 Bugly 后
即便我们的程序上线了 我们也可以知道程序崩溃在哪里!
即简单 又方便
● 调用堆栈
我们先写一个 Demo 演示一下错误
- (void)viewDidLoad { [super viewDidLoad]; [self testDemo]; } - (void)testDemo { NSString *str = nil; NSArray *array = @[@"hello word!", str]; NSLog(@"%@", array); }
运行后 程序很听话的报错了!
**2016-11-09 23:02:58.839 01-Bugly[976:81766] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]'** ***** First throw call stack:** **(** ** 0 CoreFoundation 0x000000011150034b __exceptionPreprocess + 171** ** 1 libobjc.A.dylib 0x0000000110f6121e objc_exception_throw + 48** ** 2 CoreFoundation 0x00000001114103b3 -[__NSPlaceholderArray initWithObjects:count:] + 275** ** 3 CoreFoundation 0x00000001114175c4 +[NSArray arrayWithObjects:count:] + 52** ** 4 01-Bugly 0x000000010fd06332 -[ViewController testDemo] + 98** ** 5 01-Bugly 0x000000010fd062c9 -[ViewController viewDidLoad] + 73** ** 6 UIKit 0x0000000111ac506d -[UIViewController loadViewIfRequired] + 1258** ** 7 UIKit 0x0000000111ac54a0 -[UIViewController view] + 27** ** 8 UIKit 0x000000011198f045 -[UIWindow addRootViewControllerViewIfPossible] + 71** ** 9 UIKit 0x000000011198f796 -[UIWindow _setHidden:forced:] + 293** ** 10 UIKit 0x00000001119a30a9 -[UIWindow makeKeyAndVisible] + 42** ** 11 UIKit 0x000000011191c259 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4818** ** 12 UIKit 0x00000001119223b9 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1731** ** 13 UIKit 0x000000011191f539 -[UIApplication workspaceDidEndTransaction:] + 188** ** 14 FrontBoardServices 0x000000011482576b __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24** ** 15 FrontBoardServices 0x00000001148255e4 -[FBSSerialQueue _performNext] + 189** ** 16 FrontBoardServices 0x000000011482596d -[FBSSerialQueue _performNextFromRunLoopSource] + 45** ** 17 CoreFoundation 0x00000001114a5311 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17** ** 18 CoreFoundation 0x000000011148a59c __CFRunLoopDoSources0 + 556** ** 19 CoreFoundation 0x0000000111489a86 __CFRunLoopRun + 918** ** 20 CoreFoundation 0x0000000111489494 CFRunLoopRunSpecific + 420** ** 21 UIKit 0x000000011191ddb6 -[UIApplication _run] + 434** ** 22 UIKit 0x0000000111923f34 UIApplicationMain + 159** ** 23 01-Bugly 0x000000010fd066cf main + 111** ** 24 libdyld.dylib 0x00000001132f868d start + 1** ** 25 ??? 0x0000000000000001 0x0 + 1** **)** **libc++abi.dylib: terminating with uncaught exception of type NSException** **(lldb)**
我们来看一下错误信息
通常程序崩溃后 我们的目光会聚焦在错误信息的最上方部分 如下:
__NSPlaceholderArray **数组** attempt to **试图** insert nil object **插入一个空对象** from objects[1] **在索引[1]的位置**
通常看到这里我们就开始想,程序到底哪错了,到底在哪里插入空对象了
然后就开始满世界的去找,试想我们一个项目中有成百上千个文件,我们这样找要找到什么时候
那我们如何找到更详细的信息呢?
在我们聚焦的错误信息的下方就是程序错误的详细信息
它有一个专用名词 调用堆栈
调用堆栈先执行的步骤在下方 后执行的步骤在上方
那调用堆栈给我们哪些详细的信息呢
10 UIKit 0x00000001119a30a9 -[UIWindow makeKeyAndVisible] + ** 程序启动时调用的方法 **
5 01-Bugly 0x000000010fd062c9 -[ViewController viewDidLoad] + 73 ** 我们刚刚在ViewController viewDidLoad 中调用了testDemo 方法 **
4 01-Bugly 0x000000010fd06332 -[ViewController testDemo] + 98 ** 我们所调用的testDemo方法 在 ViewController 中**
3 CoreFoundation 0x00000001114175c4 +[NSArray arrayWithObjects:count:] + 52 ** 尝试给一个数组插入数据 **
再往后程序就崩溃了 我们通过上面的信息就可以定位到 testDemo 这个函数出问题了
错误原因既是 我们向数组[1]中添加一个空对象
[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]
发现这个线索之后 我们可以就直接去 ViewController 中 找到 testDemo 发现
NSString *str = nil;为空
所以我们一定要学会调用堆栈的技巧 只有善于使用这个技巧 我们才能更快的调试错误信息
● 收集错误信息
那我们在真机测试时同样的错误提示的错误信息是什么呢?
![](http://upload-images.jianshu.io/upload_images/3077591-5299c503<br/>ab76<br/>09a0d802.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如图所示 在真机测试时只显示错误信息,不显示详细的调用堆栈的内容
那程序上线后,我们如何收集错误信息呢?
这时候我们就需要使用到第三方的框架 * Bugly *
**官方网站: https://bugly.qq.com/v2/
登录 QQ 后 如下图
![](http://upload-images.jianshu.io/upload_images/3077591-5b4021d3f82f6f50.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
进入后我们注册一下
![](http://upload-images.jianshu.io/upload_images/3077591-c2990ce3abd28137.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
注册完成后 我们来集成 第三方框架 选中 SDK -> iOS SDK 使用指南
![](http://upload-images.jianshu.io/upload_images/3077591-76d47370879d772e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在这里我推荐使用 CocoaPods 集成 Bugly 框架
打开Mac自带终端
cd "项目根目录" pod init
建立 Podfile
将项目中 Podfile 拖入 Xcode 中
不要删除文件中的内容
在 target 下方 粘贴 如下内容
pod 'Bugly'
回到终端中
pod install --no-repo-update
Tip: 我们可以通过
--help找到 CocoaPods 的帮助信息 这样,需要的东西我们就可以直接复制粘贴~~
接下来我们回到项目中 这时候记得点 白色 的文件
来到项目的 AppDelegate.m 中初始化 Bugly
//先导入头文件 #import <Bugly/Bugly.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //下面的内容一定要放在第一句 在程序启动时 下面的代码全部能监听到!!!! [Bugly startWithAppId:@"此处替换为你的AppId"]; return YES; }
此处的 AppID 在我们刚刚注册的 App 中 如下图:
![](http://upload-images.jianshu.io/upload_images/3077591-03cae1fdc99262ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
替换 AppID 后 我们导入框架的工作就完成了!
此时我们回到项目中运行程序 真机测试 继续让程序崩溃下~
崩溃后 稍等片刻回到 网站中查看崩溃日志
这里注意: 程序崩溃后 会在 AppDelegate.h 中打一个 断点**
此时后面的程序就不会继续执行 不执行就会导致错误信息无法提交到 Bugly 中
从而导致我们在崩溃日志中 无法显示崩溃结果
此时 我们回到手机中 点击实例程序 闪退即可**
![](http://upload-images.jianshu.io/upload_images/3077591-0d2c57e3191bcb45.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
点击进入 错误信息
![](http://upload-images.jianshu.io/upload_images/3077591-22db93d36daa0728.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
与我们在模拟器中 调用堆栈 的内容一致 ,并且它还帮我们将错误信息 标蓝
末语:
当我们导入腾讯的第三方框架 Bugly 后
即便我们的程序上线了 我们也可以知道程序崩溃在哪里!
即简单 又方便
相关文章推荐
- iOS 利用腾讯 Bugly 程序调试 测试代码bug 卡顿等情况
- 关于BOCHS调试保护模式程序的思路
- 关于调试dll程序的方法
- ios升级为5后,程序编译时遇到的关于libz 1.2.3.dylib类包的各种问题解决办法
- IOS开发 如何联机调试和发布程序(99$) -转载
- ios如何联机调试和发布程序
- 关于VC6调试程序时显示Unicode字符串不全的问题
- 关于c++检测内存泄露相关知识(windows程序调试)
- 关于vs2003调试时提示:试图运行项目时出错:无法启动调试 没有正确安装调试器。请运行安装程序安装
- 转:关于程序调试、高精度计时器和sleep函数
- iOS: 如何调试程序
- 关于WINDOWS7中VS调试WEB程序无法连接
- 关于c++检测内存泄露相关知识(windows程序调试)
- 关于vs2003调试时提示:试图运行项目时出错:无法启动调试 没有正确安装调试器。请运行安装程序安装
- 关于java程序的跟踪调试
- 关于利用GDB调试程序(转)
- linux下关于socket程序的调试(gdb)
- 关于c++检测内存泄露相关知识(windows程序调试)
- 关于iOS5 + XCode4.2环境下iPhone3G和3Gs + iOS4.2.1不能调试的问题解决方案整理
- IOS开发 如何联机调试和发布程序(99$)