本文转载自唐巧大神的博客,

让XCode的 Stack Trace信息可读

让XCode的 Stack Trace信息可读

NOV 14TH, 2012

昨天在写iOS代码的时候,调试的时候模拟器崩溃了。异常停在了如下整个main函数的入口处:

1
2
3
4
5
6
7
int main(int argc, char *argv[])
{    @autoreleasepool {        // 异常停在了下面这行,毫无提示作用
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyClass class]));
    }
}

XCode的Console界面报出了一些出错信息, 如下图所示:

我根据Console里面的文字提示信息,猜出应该是出现了空指针nil的操作。但是具体出错在哪一行,却不知道。最终虽然找到了bug,但是debug的过程确实费了些时间。考虑到这个stace trace信息应该对我挺有帮助才对的,所以我就查了一下如何让这原本一堆16进制的调用栈信息更可读。于是在stackoverflow上找到了2个比较好的解决办法,在这里分享给大家。

方法一

该方法的步骤是,首先在你的AppDelegate中定义一个方法, 用于处理异常:

1
2
3
4
5
void uncaughtExceptionHandler(NSException *exception) {    NSLog(@"CRASH: %@", exception);
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    // Internal error reporting
}

然后在应用启动时,设置这个方法作为自己的自定义异常回调:

1
2
3
4
5
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
    // Normal launch stuff
}

完成之后,当对于上面的异常,在定义了这个回调之后,Log信息变成如下所示,出错行一目了然,根据下面的可读的stack trace,我一下就可以找到是QuestionParser这个类的第378行导致的异常,进而可以跳到出错行分析原因,很容易就把bug修复了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Ape[2711:11303] CRASH: *** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]
Ape[2711:11303] Stack Trace: (
  0   CoreFoundation                      0x0209402e __exceptionPreprocess + 206
  1   libobjc.A.dylib                     0x01a71e7e objc_exception_throw + 44
  2   CoreFoundation                      0x0205aa95 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:] + 165
  3   CoreFoundation                      0x020874e9 +[NSDictionary dictionaryWithObjects:forKeys:count:] + 73
  4   Ape                                 0x00096a0a +[QuestionParser parseToDictionary:] + 378
  5   Ape                                 0x00096434 -[QuestionStore putQuestion:] + 308
  6   Ape                                 0x00089ddf -[QuestionViewController requestFinished:] + 303
  7   Ape                                 0x000869dd -[NetworkAgent requestFinished:] + 653
  8   Ape                                 0x00085d33 __27-[NetworkAgent addRequest:]_block_invoke_0 + 131
  9   libdispatch.dylib                   0x01cf153f _dispatch_call_block_and_release + 15
  10  libdispatch.dylib                   0x01d03014 _dispatch_client_callout + 14
  11  libdispatch.dylib                   0x01cf2fd6 _dispatch_after_timer_callback + 28
  12  libdispatch.dylib                   0x01d03014 _dispatch_client_callout + 14
  13  libdispatch.dylib                   0x01cfa8b7 _dispatch_source_latch_and_call + 219
  14  libdispatch.dylib                   0x01cf6405 _dispatch_source_invoke + 322
  15  libdispatch.dylib                   0x01cf3768 _dispatch_main_queue_callback_4CF + 187
  16  CoreFoundation                      0x0203aaf5 __CFRunLoopRun + 1925
  17  CoreFoundation                      0x02039f44 CFRunLoopRunSpecific + 276
  18  CoreFoundation                      0x02039e1b CFRunLoopRunInMode + 123
  19  GraphicsServices                    0x0282b7e3 GSEventRunModal + 88
  20  GraphicsServices                    0x0282b668 GSEventRun + 104
  21  UIKit                               0x00be265c UIApplicationMain + 1211
  22  Ape                                 0x00016c5d main + 141
  23  Ape                                 0x00002b05 start + 53
  24  ???                                 0x00000001 0x0 + 1
)

方法二

方法二相比方法一更加简单,具体做法是在XCode界面中按cmd + 6跳到Breakpoint的tab,然后点击左下角的+号,增加一个Exception的断点,如下图所示。这样,当异常出现时,会自动停在异常处,而不会抛出到UIApplicationMain。拿我的有bug的程序来说,代码会自动断在QuestionParser这个类的第378行。

总结

其实以前XCode是能显示出可读的stack trace信息的,似乎到了XCode4.2以后就出问题了。所以上面提到的2个办法相当于walk around解决了XCode4.2以后出现的bug。如果该文章对你有用,希望你能帮我点击下面的分享按钮,分享给更多朋友,同时也帮我宣传一下博客,这将有助于我分享更多的心得给大家,Have fun!

Posted by 唐巧 Nov 14th, 2012  iOS

iOS调试Bug技巧相关推荐

  1. iOS调试奇巧淫技(一)

    你以为,你以为的就是你以为的吗? 你以为你代码写的很OK啦? 你以为你的是大牛啦? 你以为的就是你以为的吗? 你的代码经得起考验吗?(PS:爱经得起考验吗) iOS调试的技巧很多,通过调试我们不仅可以 ...

  2. Eclipse调试Bug的七种常用技巧(转)

    注意事项及小结: (1)Line Breakpoint: 如果设置Conditional,监控的变量需要比当前行高一级block,譬如for(int i=0;i<20;i++)中的i,for循环 ...

  3. 调试小技巧---利用调用堆栈

    2019独角兽企业重金招聘Python工程师标准>>> 调试小技巧---利用调用堆栈 如图:在解决bug的时候,不能确定下一步程序执行到哪,可以利用Xcode中的调用堆栈  来快速查 ...

  4. # Idea 调试 Debug 技巧

    Idea 调试 Debug 技巧 IDEA 为我们提供了很多简单且非常强大的调试功能 在需要调试的行打上断点,debugger 方式启动Idea 控制台如下 调试功能说明 Show Execution ...

  5. Xamarin.iOS调试提示需要iOS SDK

    Xamarin.iOS调试提示需要iOS SDK 错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xcode ...

  6. 调试笔记--keil 断点调试小技巧

    调试笔记–keil 断点调试小技巧 给变量打断点 调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事. 将要监视的全局变量添加到watch窗口 选中 ...

  7. 12个Visual Studio调试效率技巧

    在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...

  8. GDB调试使用技巧 - 专职C++ - C++博客

    GDB调试使用技巧 - 专职C++ - C++博客 GDB调试使用技巧 现在的linux下面开发,调试程序还是GDB好啊!杯具的slickedit,linux下面有不少问题.只好放弃! 1.使用TUI ...

  9. iOS开发小技巧 -- tableView-section圆角边框解决方案

    iOS开发小技巧 -- tableView-section圆角边框解决方案 参考文章: (1)iOS开发小技巧 -- tableView-section圆角边框解决方案 (2)https://www. ...

最新文章

  1. 备忘-常用工具/网页
  2. Drupal 为前台(Front page)页面添加区域(Regions)
  3. C语言关系 是行还是列,C语言行优先和列优先的问题深入分析
  4. 所需依赖_注意细节,阿里架构师一文详解SpringDI的四种依赖注入方式
  5. 计算机检索基础知识,[转载]四 计算机文献检索基础知识(原理、结构和功能)...
  6. 【米课】思维导图与深度思考
  7. redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案
  8. 知了课堂 python_知了课堂Python Flask系列(1)-基础篇 flask视频教程下载
  9. 罗升阳 51test 博客
  10. 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界
  11. 全国湿地分类数据:内陆沼泽、盐碱地、红树林、潮汐平地
  12. 卡塔尔世界杯除了没有中国队以外,都是中国元素!
  13. Terraform学习2
  14. 微信支付结算费率怎么降低至0.2~0.35操作方法
  15. DAO跨事物调用---转账
  16. mysql怎么看端口号_mysql端口号(怎么查看mysql的端口号)
  17. 云主机Centos7下WordPress部署指南
  18. R语言计量经济学:工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
  19. css中的单位换算_css 长度单位转换器
  20. 解决U盘在Linux系统只读的问题:[sdb] Write cache: disabled, read cache: enabled, doesn‘t support DPO or FUA

热门文章

  1. Infrared and Visible Image Fusion using a Deep Learning Framework解析
  2. 计算机专业英语的特点 1,计算机专业英语的的一些特点.doc
  3. 技术文摘9 刘 樱桃
  4. 互联网营销方法十五个
  5. [1]数据分析中变量取对数的意义
  6. 无法启动MySQL服务,提示“错误1069,由于登录失败而无法启动服务”
  7. 逻辑运算符 位运算符_在现代PHP中,按位运算符仍然有意义吗?
  8. 2022年5月8日 解决手机连接电脑无法选择“传输文件”
  9. Git-2.12.0-64-bit .exe下载持续更新最新版下载
  10. ASP.NET程序员常用的85个工具