让Xcode的 stack trace信息可读
让Xcode的 stack trace信息可读
昨天在写 iOS 代码的时候,调试的时候模拟器崩溃了。异常停在了如下整个 main 函数的入口处:
int main(int argc, char *argv[]) |
Xcode 的 Console 界面报出了一些出错信息 , 如下图所示:

我根据 Console 里面的文字提示信息,猜出应该是出现了空指针 nil 的操作。但是具体出错在哪一行,却不知道。最终虽然找到了 bug,但是 debug 的过程确实费了些时间。考虑到这个 stace trace 信息应该对我挺有帮助才对的,所以我就查了一下如何让这原本一堆 16 进制的调用栈信息更可读。于是在 stackoverflow 上找到了 2 个比较好的解决办法,在这里分享给大家。
方法一
该 方法 的步骤是,首先在你的 AppDelegate 中定义一个方法 , 用于处理异常:
void uncaughtExceptionHandler(NSException *exception) {
|
然后在应用启动时,设置这个方法作为自己的自定义异常回调:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions |
完成之后,当对于上面的异常,在定义了这个回调之后,Log 信息变成如下所示,出错行一目了然,根据下面的可读的 stack trace,我一下就可以找到是 QuestionParser 这个类的第 378 行导致的异常,进而可以跳到出错行分析原因,很容易就把 bug 修复了。
Ape[2711:11303] CRASH: *** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2] |
方法二
方法二相比方法一更加简单,具体做法是在 Xcode 界面中按 cmd + 6 跳到 Breakpoint 的 tab,然后点击左下角的 + 号,增加一个 Exception 的断点,如下图所示。这样,当异常出现时,会自动停在异常处,而不会抛出到 UIApplicationMain。拿我的有 bug 的程序来说,代码会自动断在 QuestionParser 这个类的第 378 行。

总结
其实以前 Xcode 是能显示出可读的 stack trace 信息的,似乎到了 Xcode4.2 以后就出问题了。所以上面提到的 2 个办法相当于 walk around 解决了 Xcode4.2 以后出现的 bug。如果该文章对你有用,希望你能帮我点击下面的分享按钮,分享给更多朋友,同时也帮我宣传一下博客,这将有助于我分享更多的心得给大家,Have fun!
让Xcode的 stack trace信息可读的更多相关文章
- 让XCode的Stack Trace信息可读
程序报错信息如下:
- XCode的 Stack Trace,调试时抛出异常,定位到某一行代码
在Xcode调试程序的时候,总是会出现不知道错误在什么地方的问题,很是捉急,现在又一个办法,可以具体定位到错误行的代码,试一下吧?超级好用 操作很简单: 1.在XCode界面中按cmd + 6快捷键, ...
- 怎么从代码中拿到栈回溯信息(call stack trace)
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:怎么从代码中拿到栈回溯信息(call stack trace).
- 三、jdk工具之jstack(Java Stack Trace)
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
- dump 分析模式之 INCORRECT STACK TRACE - djm2005dy的专栏 - 博客频道 - CSDN.NET
Dump 分析模式之 INCORRECT STACK TRACE dump 分析模式之 INCORRECT STACK TRACE 翻译自 MDA-Anthology Page288 初学者常犯的错 ...
- 项目跑起来之后,一会儿后台就会报错Illegal access: this web application instance has been stopped already. Could not load [com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask]. The following stack trace
一月 24, 2016 6:42:54 下午 org.apache.catalina.loader.WebappClassLoaderBase checkStateForResourceLoading ...
- This is very likely to create a memory leak. Stack trace of thread
1.错误描述 警告: The web application [cmp] appears to have started a thread named [Abandoned connection cl ...
- java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE 的理解
[2013-12-06 11:06:21,715] [C3P0PooledConnectionPoolManager[identityToken->2tl0n98y1iwg7cbdzzq7a|7 ...
- JavaScript 查看stack trace
How can I get a JavaScript stack trace when I throw an exception? Edit 2 (2017): In all modern brows ...
随机推荐
- 在网页中显示html代码
string str = "<div>aaa</div>"; this.Literal1.Text = string.Format("<pr ...
- c语言的字符串操作(比较详细)
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...
- POJ 1947 Rebuilding Roads 树形DP
Rebuilding Roads Description The cows have reconstructed Farmer John's farm, with its N barns (1 & ...
- 聊聊传统oo和js的某些对比——对象/函数/new关键字等
自己的学习记录,写的短点可以以后短时间内理清一些疑惑,看前要求你至少了解js中关于原型链等基本概念,因为文章直接以总结的形式理出知识点,没有去解释一些基本的概念! 1.1.熟记两句话,预预热 1. 函 ...
- LoadRunner 脚本学习 -- 动态储存方式和静态储存方式
我们在定义变量是,根据定义的位置不同,分为全局变量与局部变量.我出生在一个叫“舞阳”的小县城,在这个县城中也有人名“舞阳”,前一个作用于整个县城,后一个只作用于他个人.那么从变量值的存在生存期角度,又 ...
- 自定义ActionBar
/** * 1.创建ActionBar对象getSupportActionBar() * 2.布置自己的ActionBar布局(在res/layout) * 3.把自定义的ActionBar布局加载到 ...
- jade学习02
模版继承 ; block,extends ;如果是原生html文件的话,后缀html //layout.jade doctype html html head meat(charset='utf-8' ...
- 3、利用SuperObject 循环处理Json深层次的值
//遍历对象 procedure TForm1.Button5Click(Sender: TObject); var item,jo: ISuperObject; ja,JA_TYPE,JA_MAC: ...
- HBase Shell 常见操作
1.一般操作 status 查看状态 version 查看HBase版本 2.DDL操作 create 'member','member_id','address','info' 创建了一个membe ...
- iOS之03-类的合理设计
以下代码为了充分学习理解 类与对象 类与对象的定义 类就是将事物的共有属性和方法抽离出来形成的:类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起. 对象是具有类类 ...