`
shappy1978
  • 浏览: 680291 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

让XCode的 Stack Trace信息可读

 
阅读更多

昨天在写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!

分享到:
评论

相关推荐

    让xcode9.1支持 iOS11.2

    让xcode9.1支持 iOS11.2,,不能设置免费了。。。 xcode 11.2 https://pan.baidu.com/s/1i4Yit5j 执行: sudo cp -r /Users/ios-dev/Downloads/11.2\ \(15C5097c\) /Applications/Xcode.app/Contents/Developer/...

    让 Xcode 支持真机调试 iOS14.2(beta)

    让 Xcode 支持真机调试 iOS14.2(beta) 打开 访达 (command + shift + G )前往文件夹 拷贝到 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport目录下重启 Xcode 即可

    让Xcode对应多个版本的iOS SDK.

    让Xcode对应多个版本的iOS SDK.

    让Xcode支持iOS11.3设备真机测试

    让Xcode支持iOS11.3设备真机测试 支持包的位置位于:Xcode.app//Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

    xcode10-xcode14各版本sdk

    ios xcode10-xcode14各版本sdk,主要包括7 8 9 10 11 12 13 14个版本以及各小版本,博客中有截图。

    xcode4.2.1 xcode4.1 xcode3.2.6final

    xcode_4.2.1_for_lion 文件大小:1.69G xcode_4.1_for_lion 文件大小:2.96G xcode_3.2.6_and_ios_sdk_4.3__final 文件大小:4.14G 2012年1月上传,亲自测试可以下载。 ================================

    让Appium兼容Xcode6.0

    Appium是个新东西,支持原生的APP自动化测试,基于Android和iOS提供的SDK,最近apple发布了最新的Xcode,今天不小心更新了,再次使用appium的inspector时各种报错,于是一步步的进行修改源码。 由于Xcode6修改了...

    XCodeXCode下载

    XCode下载

    Xcode 12.1镜像文件

    Xcode 不升级支持真机运行12.1版本信息,具体操作参照我的博客https://mp.csdn.net/postedit/52624583

    卸载xcode的命令

    卸载xcode的命令

    查找Xcode无用代码

    查找Xcode无用代码

    xcode快捷键

    xcode快捷键xcode快捷键xcode快捷键xcode快捷键xcode快捷键xcode快捷键xcode快捷键xcode快捷键xcode快捷键xcode快捷键

    Xcode 15.6 真机包

    Finder:shift + command + G /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 将包放入该目录下验证密码,并重启Xcode, 就可以运行15.6系统的真机

    Xcode快捷键大全,超全

    苹果官方的Xcode快捷键大全,易读且支持搜索

    xcode 自动对齐插件

    xcode缺少想visual studio开发环境的快速自动对其命令,这个插件可以帮助你

    xcode disk image 10.1

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.1

    xcode ios11.2 DeviceSupport文件

    xcode ios11.2 DeviceSupport文件,存放目录/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

    让Xcode支持iOS11.4 Beta设备真机测试

    让Xcode支持iOS11.4 Beta设备真机测试 支持包的位置位于:Xcode.app//Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

    xcode 混淆工具

    xcode oc代码混淆

    xcode4.0.2sdk4.3

    xcode4.0.2sdk4.3 xcode4.0.2sdk4.3 xcode4.0.2sdk4.3xcode4.0.2sdk4.3

Global site tag (gtag.js) - Google Analytics