昨天在写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,,不能设置免费了。。。 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) 打开 访达 (command + shift + G )前往文件夹 拷贝到 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport目录下重启 Xcode 即可
Xcode 15.4是该系列的一个版本,提供了强大的工具集,让开发者能够高效地创建高质量的应用程序。本文将深入探讨Xcode 15.4中的真机调试功能及其相关知识点。 首先,了解真机调试的重要性。在软件开发过程中,模拟器...
这些版本的 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镜像文件:保持对iOS 12.1真机支持的详尽指南》 在iOS应用开发过程中,Xcode作为官方的集成开发环境(IDE),扮演着至关重要的角色。然而,随着新版本的发布,开发者们可能会面临一个问题:如何在不...
标题中的“xcode disk image 10.1”指的是Xcode的一个特定版本,与iOS 10.1设备支持相关的磁盘映像。这个版本的Xcode包含了开发和测试iOS 10.1应用程序所需的所有工具和资源。Xcode是Apple官方的集成开发环境(IDE)...
在iOS和macOS应用开发领域,Xcode是Apple官方推荐的集成开发环境(IDE),它提供了丰富的功能,如代码编辑、调试、构建管理等。然而,对于习惯于使用Visual Studio等其他IDE的开发者来说,Xcode在某些方面可能略显...
《Xcode 12.1:深度解析与应用实践》 ...对于任何致力于Apple平台应用开发的人来说,深入理解和掌握Xcode 12.1的新特性都是必不可少的。通过持续学习和实践,开发者可以充分利用这些工具,打造出更优秀的产品。
让Xcode支持iOS11.3设备真机测试 支持包的位置位于:Xcode.app//Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
4. **真机调试**:真机调试是Xcode的核心功能之一,它让开发者能够在真实设备上测试应用程序,以便更准确地模拟用户行为和设备性能。Xcode 15.4可能改进了设备连接的稳定性,以及调试过程中的性能监控和错误报告。 ...
### 卸载Xcode的命令 在开发领域中,Xcode是苹果官方为开发者提供的集成开发环境(Integrated Development Environment,IDE),主要用于iOS、iPadOS、macOS、watchOS及tvOS的应用程序开发。然而,在某些情况下,...
Xcode 14.2全面支持最新的Apple平台特性,如 SwiftUI 3、App Clips、以及针对M1系列芯片的原生支持,让开发者能够利用最新的硬件和软件技术进行创新。 ### 10. 社区支持与更新 Xcode 14.2还包含了对开源社区项目的...
Xcode中的错误和警告信息是宝贵的调试资源,开发者需要对这些信息进行仔细阅读和理解。 知识点八:对不同Xcode版本的兼容性考虑 在使用Xcode的自动化工具和脚本时,开发者需要考虑到不同Xcode版本之间的兼容性问题...
xcode 16.1 (下载最新的xcode14.2 获取的16.1) 在: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 路径下重启xcode 支持 iphone 14 pro
ios xcode10-xcode14各版本sdk,主要包括7 8 9 10 11 12 13 14个版本以及各小版本,博客中有截图。
真机调试是iOS开发不可或缺的一部分,因为它允许开发者在目标设备上直接运行和测试应用程序,确保代码在不同硬件配置和系统版本上的兼容性。相比模拟器,真机调试能更真实地反映出应用在用户手中的表现,包括性能、...
**Xcode iOS11.0配置包详解** Xcode是Apple官方推出的开发工具,用于构建、测试和发布iOS、iPadOS、macOS、watchOS以及tvOS的应用程序。在这个特定的场景中,我们讨论的是针对iOS 11.0版本的Xcode配置包。这个配置...
在iOS和macOS的开发过程中,代码注释是至关重要的,它不仅有助于提高代码的可读性,还能方便团队协作,让其他开发者更容易理解你的代码逻辑。VVDocumenter-Xcode是一款专为Xcode6设计的高效注释插件,它简化了编写...
标题“低版本xcode兼容iOS15.zip”提示我们这个压缩包文件包含了让低版本Xcode与iOS 15兼容的相关资源。 描述中提到的“将解压缩后的文件放到以下文件夹(适当修改文件名): 在访达中使用快捷键:低版本xcode兼容...