在调试程序的时候,总是碰到crash的bug,而且一追踪就是一些汇编的代码,让人特别疑惑。

一般情况下可以通过增加两天断点来解决此问题,方法介绍如下:

基本上有错误分为以下几种类型:

signal(SIGABRT, MySignalHandler);

signal(SIGILL, MySignalHandler);

signal(SIGSEGV, MySignalHandler);

signal(SIGFPE, MySignalHandler);

signal(SIGBUS, MySignalHandler);

signal(SIGPIPE, MySignalHandler);

SIGABRT和EXC_BAD_ACCESS较为特殊,算是比较好跟进。

SIGABRT是系统报错,在memery warning之后,系统会把程序强制退出,报的就是这个错误。

EXC_BAD_ACCESS 大多数时候是内存提前释放而引起的问题,或者访问的方法不存在引起的。

 1. Xcode内置GDB,可以使用GDB调试,调试命令:

1.1 po 命令:为 print object 的缩写,显示对象的文本描述

(lldb) po [$eax class]:输出异常对象的地址

(lldb) po [$eax name]:输出这个异常的名字

(lldb) po [$eax reason]:这个将会输出错误消息:

(lldb)  “po $eax”:对这个对象调用“description”方法和打印出来

“$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如你在设备上调试,你将需要使用”$r0″寄存器

1.2 print 命令:有点类似于格式化输出,可以输出对象的不同信息

比如:print (char*)[[dic description] cString]、(lldb) print (int)[label retainCount]

1.3 info 命令:我们可以查看内存地址所在信息

1.4 info line *内存地址:可以获取内存地址所在的代码行相关信息

1.5 show 命令:显示 GDB 相关的信息。如:show version 显示GDB版本信息

1.6 bt: 显示当前进程的函数调用栈的情况;"up num":查看调用的详细信息;down:返回栈列表;l:显示详细代码信息;p:输出数值。

2. 添加全局断点(Add Exception BreakPoint):

2.1 添加步骤:

1. In the bottom-left corner of the breakpoints navigator, click the Add button. 
2. Choose Add Exception Breakpoint. 
3. Choose the type of exception from the Exception pop-up menu. 
4. Choose the phase of the exception handling process at which you want program execution to stop. 
5. Click Done.

2.2 使用场景:

程序因为SIGABRT而crash,想要定位到导致crash的行。

然后右键单击该断点选择move breakpoint to,选择User,即可以在所有项目中起作用

3. 添加符号断点(Add Symbolic BreakPoint):

3.1 断点执行的时机:Symbolic breakpoints stop program execution when a specific function or method starts executing

3.2 添加步骤:

1. Steps In the bottom-left corner of the breakpoint navigator, click the Add button.

2. Choose Add Symbolic Breakpoint. 
3. Enter the symbol name in the Symbol field. 
4. Click Done.

3.3 使用场景:

当想让系统在某个指定条件处中断时,设置相应的断点。

比如:

objc_exception_throw:在系统抛出异常处设置断点。

-[NSException raise]:

还可添加输入malloc_error_break的symbolic断点,以跟踪调试释放了2次的对象

4. 设置NSZombieEnabledMallocStackLoggingNSAutoreleaseFreedObjectCheckEnabledNSDebugEnabled

4.1 设置方法:

1. Product->Edit Scheme...->Run...->EnvironmentVariables. 
2. add NSZombieEnabled,set the value with YES
3. add MallocStackLogging, set the value with YES.

4. add NSAutoreleaseFreedObjectCheckEnabled, set the value with YES.

5. add NSDebugEnabled, set the value with YES.

4.2 使用场景:

主要为了解决EXC_BAD_ACCESS问题,MallocStackLogging用来启用malloc记录(使用方式 malloc_history ${App_PID} ${Object_instance_addr})。

4.3 需要注意的问题

NSZombieEnabled只能在调试的时候使用,千万不要忘记在产品发布的时候去掉,因为NSZombieEnabled不会真正去释放dealloc对象的内存。

5. 重写respondsToSelector方法

5.1 实现方式

#ifdef _FOR_DEBUG_  
-(BOOL) respondsToSelector:(SEL)aSelector {  
printf("SELECTOR: %sn", [NSStringFromSelector(aSelector) UTF8String]);  
return [super respondsToSelector:aSelector];  
}  
#endif  
5.2 使用方法:
需要在每个object的.m或者.mm文件中加入上面代码(应该可以使用类属实现),并且在other c flags中加入-D _FOR_DEBUG_(记住请只在Debug  Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。

参考文章:

1. Xcode GDB 调试:http://blog.csdn.net/ch_soft/article/details/7005998

2. XCode的一些调试技巧:http://blog.csdn.net/kesalin/article/details/7222153

3. About the Breakpoint  Navigator:http://developer.apple.com/library/mac/#recipes/xcode_help-breakpoint_navigator/articles/about_breakpoint_navigator.html#//apple_ref/doc/uid/TP40010433-CH6-SW1

4. 当程序崩溃的时候怎么办 part-1:http://article.ityran.com/archives/1006

5. 当程序崩溃的时候怎么办 Part-2:http://article.ityran.com/archives/1143

6. Memory Usage Performance  Guidelines:https://developer.apple.com/library/mac/#documentation /performance/Conceptual/ManagingMemory/ManagingMemory.html#//apple_ref/doc/uid/10000160-SW1

iOS 调试 crash breakpoint EXC_BAD_ACCESS SIGABRT的更多相关文章

  1. [ios-必看] IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS

    from:http://article.ityran.com/archives/1143 有这样一种情形:当我们正在快乐的致力于我们的app时,并且什么看都是无比顺利,但是突然,坑爹啊,它崩溃了.(悲 ...

  2. iOS调试

    iOS高效调试 写代码难免出现bug.储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.下面就和大家分享一些我在工作中常用的iOS调试小技能. 1. 打印 最简单,基础的调试方法就是打印日志了 ...

  3. 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    对于提交的苹果官方的app,在审核的时候会给我们一些crash文件,对于这些有用的文件,里面是关于我们的bug的一些信息,那么该如何去调试呢 第一步:在任意目录创建一个目录,用来调试crash,我这里 ...

  4. iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)

    时间2013-08-20 12:49:20 GoWhich原文  http://www.gowhich.com/blog/view/id/343 苹果官方 Crash文件分析方法 (iOS系统Cras ...

  5. iOS解析crash日志:

    iOS解析crash日志:我们在ios开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应用,或者是rele ...

  6. iOS 调试心得

    修复 bug 占用我们日常开发的大部分时间,熟练的使用调试工具可以给我们节约大部分的时间. LLDB 的常用命令 expression expresion 是一个非常常用的命令,我们可以通过这个命令来 ...

  7. Xamarin.iOS调试提示需要iOS SDK

    Xamarin.iOS调试提示需要iOS SDK   错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xco ...

  8. 提高Android和iOS调试编译速度

    http://www.cnblogs.com/findumars/p/7841252.html 提高Android和iOS调试编译速度   如果您使用Delphi开发App,就会遇到:Android和 ...

  9. uniapp - 关于ios调试

    [ios调试] 1.一台windows电脑.一根apple数据线(一旦连接以后,apple设备就会自动识别itunes软件,如果没有安装会提示) 2.安装itunes (爱思助手) 3.官方教程:ht ...

随机推荐

  1. iOS scrollsToTop属性失效

    点击状态栏返回顶部失效,是因为scrollView的scrollsToTop属性失效 (继承于scrollView的tableView collectionView也算). 这个属性默认是开启的,然而 ...

  2. RobotFrameWork编写接口测试及如何断言

    1. 前言 本篇是第一系列(Http接口自动化)的第五课程,如果对系列课程大纲不清楚的,可以查看<RobotFramework系列免费课程-开课了~>. 前面我们介绍了,在真正实施前,需先 ...

  3. CSS 水平居中与垂直居中

    前言 在CSS布局中,水平居中与垂直居中一直是用到比较多的,在本篇中将介绍水平居中.垂直居中的几种方式. 示例 HTML: <div class="parent"> & ...

  4. Atitit 文员招募规范 attilax总结

    Atitit 文员招募规范 attilax总结 1. 概念 2 2. 文员招募范文 2 3. 重大意义 3 3.1. 第一层  文章撰写 能力 3 3.2. 第二次 文档管理能力 文档索引 检索查找 ...

  5. 【转载】基于rasa的对话系统搭建(上)

    文章介绍使用rasa nlu和 rasa core 实现一个电信领域对话系统demo,实现简单的业务查询办理功能,更完善的实现需要进一步数据的收集.demo基于玩具数据集,可以达到下面的效果: Bot ...

  6. 【转载】Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 解决办法

    Docker Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docke ...

  7. Activity的Launch mode详解,A B C D的singleTask模式

    本文参考了此文http://hi.baidu.com/amauri3389/blog/item/a54475c2a4b2f040b219a86a.html 另附 android task与back s ...

  8. 关于Unity中摇杆的操作

    之前在解决摇杆控制角色的时候使用的是RPG游戏中主角的运动方式,有八个方向,最近找到一个新的方法,可以比较流畅地控制角色各个方向的移动 步骤 1.Easy Touch插件,角色控制器组件 2.在控制角 ...

  9. 解决webdiyer:AspNetPager分页控件在IE模式下点击页号不能翻页的问题。

    在网站根目录下新建ie.browser文件, 然后用记事本打开. 将以下代码粘贴进去,保存即可,目的是让其与IE11的 UserAgent 匹配,使 .net framework 认识这是一个已知的浏 ...

  10. Flask-SQLAlchemy 中多表链接查询(不使用外键)

    SQLAlchemy 是一个功能强大的 ORM . Flask-SQLAlchemy 是一个 Flask 插件,它让我们在 Flask 框架中使用 SQLAlchemy 变得更容易. 本篇介绍我在使用 ...