`
shappy1978
  • 浏览: 700451 次
  • 性别: 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 15.4 真机调试

    Xcode 15.4是该系列的一个版本,提供了强大的工具集,让开发者能够高效地创建高质量的应用程序。本文将深入探讨Xcode 15.4中的真机调试功能及其相关知识点。 首先,了解真机调试的重要性。在软件开发过程中,模拟器...

    xcode4.2.1 xcode4.1 xcode3.2.6final

    这些版本的 Xcode 均可从 Apple 官方网站下载,下载链接如下: - [Xcode 4.2.1 for Lion](http://adcdownload.apple.com/Developer_Tools/xcode_4.2.1_for_lion/xcode_4.2.1_for_lion.dmg) - [Xcode 4.1 for Lion]...

    Xcode 12.1镜像文件

    《Xcode 12.1镜像文件:保持对iOS 12.1真机支持的详尽指南》 在iOS应用开发过程中,Xcode作为官方的集成开发环境(IDE),扮演着至关重要的角色。然而,随着新版本的发布,开发者们可能会面临一个问题:如何在不...

    xcode disk image 10.1

    标题中的“xcode disk image 10.1”指的是Xcode的一个特定版本,与iOS 10.1设备支持相关的磁盘映像。这个版本的Xcode包含了开发和测试iOS 10.1应用程序所需的所有工具和资源。Xcode是Apple官方的集成开发环境(IDE)...

    xcode 自动对齐插件

    在iOS和macOS应用开发领域,Xcode是Apple官方推荐的集成开发环境(IDE),它提供了丰富的功能,如代码编辑、调试、构建管理等。然而,对于习惯于使用Visual Studio等其他IDE的开发者来说,Xcode在某些方面可能略显...

    xcode 12.1

    《Xcode 12.1:深度解析与应用实践》 ...对于任何致力于Apple平台应用开发的人来说,深入理解和掌握Xcode 12.1的新特性都是必不可少的。通过持续学习和实践,开发者可以充分利用这些工具,打造出更优秀的产品。

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

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

    xcode 15.4 真机调试包

    4. **真机调试**:真机调试是Xcode的核心功能之一,它让开发者能够在真实设备上测试应用程序,以便更准确地模拟用户行为和设备性能。Xcode 15.4可能改进了设备连接的稳定性,以及调试过程中的性能监控和错误报告。 ...

    卸载xcode的命令

    ### 卸载Xcode的命令 在开发领域中,Xcode是苹果官方为开发者提供的集成开发环境(Integrated Development Environment,IDE),主要用于iOS、iPadOS、macOS、watchOS及tvOS的应用程序开发。然而,在某些情况下,...

    Xcode 14.2 绝对好用

    Xcode 14.2全面支持最新的Apple平台特性,如 SwiftUI 3、App Clips、以及针对M1系列芯片的原生支持,让开发者能够利用最新的硬件和软件技术进行创新。 ### 10. 社区支持与更新 Xcode 14.2还包含了对开源社区项目的...

    Xcode根据编译次数自动增加Build属性(Xcode自带功能实现)

    Xcode中的错误和警告信息是宝贵的调试资源,开发者需要对这些信息进行仔细阅读和理解。 知识点八:对不同Xcode版本的兼容性考虑 在使用Xcode的自动化工具和脚本时,开发者需要考虑到不同Xcode版本之间的兼容性问题...

    xcode 16.1 (下载最新的xcode14.2 获取的16.1)

    xcode 16.1 (下载最新的xcode14.2 获取的16.1) 在: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 路径下重启xcode 支持 iphone 14 pro

    xcode10-xcode14各版本sdk

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

    xcode16.1真机调试包

    真机调试是iOS开发不可或缺的一部分,因为它允许开发者在目标设备上直接运行和测试应用程序,确保代码在不同硬件配置和系统版本上的兼容性。相比模拟器,真机调试能更真实地反映出应用在用户手中的表现,包括性能、...

    Xcode iOS11.0 配置包

    **Xcode iOS11.0配置包详解** Xcode是Apple官方推出的开发工具,用于构建、测试和发布iOS、iPadOS、macOS、watchOS以及tvOS的应用程序。在这个特定的场景中,我们讨论的是针对iOS 11.0版本的Xcode配置包。这个配置...

    VVDocumenter-Xcode xcode6 亲测

    在iOS和macOS的开发过程中,代码注释是至关重要的,它不仅有助于提高代码的可读性,还能方便团队协作,让其他开发者更容易理解你的代码逻辑。VVDocumenter-Xcode是一款专为Xcode6设计的高效注释插件,它简化了编写...

    低版本xcode兼容iOS15.zip

    标题“低版本xcode兼容iOS15.zip”提示我们这个压缩包文件包含了让低版本Xcode与iOS 15兼容的相关资源。 描述中提到的“将解压缩后的文件放到以下文件夹(适当修改文件名): 在访达中使用快捷键:低版本xcode兼容...

Global site tag (gtag.js) - Google Analytics