让XCode的 Stack Trace信息可读

FastDDS之共享内存 transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。 阅读详情

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

元数据及数据仓库相关概念 文章目录元数据(metadata)的概念Data about Data定义技术元数据业务元数据总结数据仓库ODS简单的理解为 Operational Data Store, 运营数据仓储 数据整合层(也叫做数据缓冲层)EDW简单理解为 Enterprise Data Warehouse, 企业数据仓库ODS与EDW之间的差异使用角色数据来源数据获取性能和及时性数据架构数据共享能力数据系统提供应用数... 阅读详情

相关推荐

数据集分享 | IWR1642呼吸心跳数据集

雷达开源数据库 数据集

【调皮连续波】雷达技术领域知识博主 3204

xcode如何查看callstack

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34357962的博客 471

伪距单点定位算法原理以及利用最小二乘法计算实例

即该公式:建立下列代价函数满足最佳估值的条件为:即:可解得未知参数 X 的最佳估值由于每个可见卫星观测量的精度可能不一样,这时,需要对不同观测量赋予一个权重系数,称为加权。

qq_43381998的博客 1万+

xcode4.2中如何取消ARC

sdk5的xcode自带了arc,虽然arc是比gc强大很多,但由于开发的习惯性,还有框架不适应,在arc还没足够稳定和安全以前,暂时还是使用手动alloc和release等。 至于如果取消arc,分3步: 1、project -> Build settings ->Apple LLVM complier 3.0 - Language-&...

weixin_34038652的博客 145

华为HCIA-Datacom实战:200人企业园区网从规划到部署全流程解析

本文详细解析了华为HCIA-Datacom认证实战中200人企业园区网的规划与部署全流程。从需求分析、组网架构设计到设备选型、VLAN划分及安全策略实施,全面覆盖园区网建设的关键环节,特别针对部门隔离、无线覆盖和基础安全防护等典型场景提供可落地的解决方案。

f0g1h2的博客 710

AI 编程组合之deepseek+vscode+cline插件,使用deepseek大模型实现代码自动生成

本文介绍了VSCODE下cline插件的安装结合DeepSeek-V3,ai编程的组合套件,举了两个例子一个是生成登录页面,一个是生成贪吃蛇游戏

技术博客 7万+

[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from object

错误: // 苹果审核给的错误 CoreFoundation 0x1a1331dd0 +[NSDictionary dictionaryWithObjects:forKeys:count:] + 59 // 真实的错误 [__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0] [__NSPlaceholderDictionary ini..

huwan.cn的博客 3437

Ovito隐藏技巧:用Expression Selection快速提取分子链(附模糊背景配置参数)

本文详细介绍了Ovito软件中Expression Selection功能的隐藏技巧,用于从复杂的分子动力学模拟数据中快速、精准地提取目标分子链。通过结合Expand Selection和Invert Selection等修饰器,形成一套高效的工作流,并深入解析了实现SCI论文级渲染效果的景深模糊参数配置,帮助研究者大幅提升数据处理与图片生成效率。

pz890123的博客 867

logback配置示例-包含生成json日志,与ELK整合

<?xml version="1.0" encoding="UTF-8"?> <configuration> <contextName>${HOSTNAME}</contextName> <property name="LOG_PATH" value="phantom-log" />

741

YOLOv13添加轻量化的EMA模块Faster_EMA,轻量又涨点!map50提升4.56个点,召回率提升9.66!

本文介绍了YOLOv13模型的优化移植方法,通过添加Faster_EMA模块和超参数调整,使模型性能显著提升。主要修改包括:1) 创建新的模型配置文件yolov13-Faster_EMA.yaml;2) 在tasks.py中添加新模块;3) 修改__init__.py和block.py文件,新增Partial_conv3和DropPath类。优化后模型mAP50提升4.56%,召回率提升9.66%,验证了改进方案的有效性。代码实现了局部卷积和随机深度等先进技术,为YOLO系列模型性能优化提供了新思路。

FJN110的博客 2604

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7087

让Xcode的 stack trace信息可读

让Xcode的 stack trace信息可读 昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了。异常停在了如下整个 main 函数的入口处: int main(int argc, char *argv[]){ @autoreleasepool { // 异常停在了下面这行,毫无提示作用 return UIApp...

aaa1231722的博客 95

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532
上一篇: IOS中各种icon图片大小尺寸汇总
下一篇: iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
buringHe
博客等级 码龄12年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值