iOS新手调试

来源:互联网 发布:淘宝售假怎么投诉 编辑:程序博客网 时间:2024/05/16 02:01

1 -> 全局断点

2 -> 调试堆栈

3 -> 打印调试

4 -> 调试工具Bugly


crash案例:  (给数组插入了一个空值, 会崩溃)

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {  
  2.       
  3.     <span style="color:#ff6666;">NSString *str = nil;</span>  
  4.       
  5.     NSArray *arr = @[@"abc", <span style="color:#ff0000;">str</span>];  
  6.       
  7.     NSLog(@"%@",arr);  
  8. }  
  9. </span>  

点击屏幕会出现崩溃, 并且crash默认断点会停留在main函数.

1. 全局断点调试定位:

command + 7跳至断点界面,

 

运行崩溃会卡在出问题的那一行,

再结合崩溃原因, 可知在这一行给数组插入了一个空值, 导致crash.


2.  调试堆栈:

有些情况全局断点是不起作用的, 这时候结合控制台输出信息查看,



这时候很可能只看懂了crash原因, 就急着在所有文件里查看哪个数组出问题了, 但是一旦文件很大, 找起来会非常麻烦.  其实可以注意一下控制台打印的信息, 称为调试堆栈, 先运行的代码在下面显示, 注意看图中画红线的部分, 先调用了ViewController的touchesBegan方法, 再创建了一个NSArray数组, 接着就在初始化的时候停住了, 此时很好的定位了,在ViewController中查找touchBegan方法, 从而找到出问题的数组.



3. 打印输出调试:

在开发过程中, 为了方便调试, 通常会在有需要的地方进行打印, 此时可以新建一个pch文件, 自定义NSLog打印, 方便在调试阶段和上线之后的代码调试, 具体做法如下:

步骤一: 新建一个pch文件, 在并添加pch文件关联, 具体做法如下图:




接下来修改pch文件内容, 

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">/// 保证宏定义只会在OC代码中被引用, 否则,一旦引入C/C++代码会报错  
  2. #ifdef __OBJC__  
  3.   
  4. #ifdef DEBUG  
  5. #define NSLog(...) NSLog(__VA_ARGS__)  
  6. #else  
  7. #define NSLog(...)  
  8. #endif  
  9.   
  10. #endif  
  11. </span>  

添加完之后会发现工程中所有的NSLog变为了褐色, 并且能正常打印, 一旦产品上线, 所有的打印都不会输出, 更改状态如下图:


当然, 为了让输出更具备调试效果, 打印出方法名和NSLog所在行数, 可以将NSLog宏定义修改为如下:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">/// 保证宏定义只会在OC代码中被引用, 否则,一旦引入C/C++代码会报错  
  2. #ifdef __OBJC__  
  3.   
  4. #ifdef DEBUG  
  5. #define NSLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);  
  6. #else  
  7. #define NSL(...)  
  8. #endif  
  9.   
  10. #endif</span>  
打印效果如下图:


4. 利用Bugly搜集项目开发过程中的错误信息, 

进入腾讯Bugly官网,进行登录注册app, 下载集成SDK等操作, 具体如下图:














可以看到, 此时运行程序崩溃还是搜集不到错误信息的, 原因为上面提到过的, 崩溃会卡在某一行, 那是一个崩溃断点, 如下图:


解决方法为把程序退出后, 直接在测试机上点开, 发现程序会闪退, 此时再去Bugly崩溃日志页面就可以看到捕获的错误日志了



发现搜集到的错误信息和调试阶段在调试堆栈中输出的信息一致, 所以当产品已上线发现有Bug时, 用Bugly调试能更快的定位错误地点.

值得注意的是, 要使用Bugly, 在appdelegate中, bugly的代码需要放在第一句, 这样才能够对以后的所有代码起作用.



以上是本人开发过程中常用的一些调试方法, 希望对各位看官有所帮助, 谢谢支持~~


1 0