关于出现僵尸信号SIGBAT或者EXC_BAD_ACCESS的解决方案
随着用xcode开发的深入,相信很多同学都对出现SIGBAT或者EXC_BAD_ACCESS的问题,编译是对的,运行时做了某些操作,就跳到main函数里面了,然后出现SIGBAT或者EXC_BAD_ACCESS的提示,提示的信息无法正确判断出错原因。
下面给大家提供一个方法,会在控制台中输出出现SIGBAT或者EXC_BAD_ACCESS的原因,基本90%能解决你的问题。
?
1 2 3 4 5 6 7 8 9 | 第一步:在Xcode的菜单栏选择“Product”,然后选择“EditScheme”;
第二步:在弹出的对话框中选择“Arguments”;
第三步:在“EnvironmentVaribles”中添加“NSZombieEnabled”,值是“YES”。 这样就大功告成了。
这时候,如果你的程序在运行过程中还出现SIGBAT或者EXC_BAD_ACCESS错误, 控制台输出的信息可以帮你准确定位到错误的原因。 |
Tag : Debug , Zombie , SIGBAT , EXC_BAD_ACCESS , 调试 , 崩溃
有用
3
没用
3
3772 次查看 |code4app创建 | 来源 | 2012-08-04 10:51:34
- 现在的xcode4.2以上,这个选项默认是有的,但还是没用,正确的方法应该是这样
?
- 1
- 在Breakpointnavigator里面加入出错时自动加breakpoint的功能(自动加Breakpoint的方法:你先进入Breakpointnavigator,然后在左下角可以看到一个可爱的加号,点击后出现窗口,Exception选项选All,Break选项选OnThrow,然后再点击窗口底下的那个Done就搞定了……)……有了这个就可以立刻查出错误在哪里
有用
3
没用
0
骗仔黄创建 | 来源 | 2012-09-10 11:32:47
- ?
- 1
- 进入楼上设置点击Xcode编辑面板,按下:command + 6 即可进入,然后再设置!
-
禁止某几个文件用ARC模式编译
在一个支持ARC(Automatic Reference Counting)的项目中,有时候需要禁止其中几个文件使用ARC模式编译(比如你用了第三方不支持ARC的类库)。
?
1
2
3
4
/*
在要禁止ARC编译的源文件的 “compiler flags”中添加 “-fno-objc-arc”。
对于 Xcode 4,可以在 target -> Build Phases -> Compile Sources中找到“compiler flags”。
*/
ARC和非ARC之间的转换方法
?
1
2
3
1,选择项目中的Targets,选中你所要操作的Target,
2,选BuildPhases,在其中ComplieSources中选择需要ARC的文件双击,
并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc
当程序崩溃(Crash)时发出通知
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//BSCrashNotifier is a bundle that allows you to be notified when your app is crashing.
NSBundle* bundle = [NSBundlebundleWithPath:[[NSBundlemainBundle]pathForResource:@"BSCrashNotifier"ofType:@"bundle"]];
ClasscrashNotifierClass = [bundle principalClass];
if (crashNotifierClass)
{
[crashNotifierClassonCrashSend:@selector(weCrashed:)to:self];
}
else
{
NSLog(@"couldn't load bundle");
}
//and implement the notification method like:
- (void)weCrashed:(int)signalNumber
{
NSLog(@"we crashed: %i",signalNumber);
}
分类:iOS开发之基础篇
2012-08-28 10:24 599人阅读评论(0) 收藏 举报
xcodeobjectaccessvariablesexceptionscheme
目录(?)
[+]
前记:编写代码过程中,出现错误、异常是不可避免的,这个时候,就体现了调试的重要性,下面就总结一下,平常我自己使用的一些调试技巧,以及汇总网络上其他网友使用的技巧。(ps以后有新的调试技巧,我也会一并更新)
1、使用僵尸变量(NSZombieEnabled)
具体使用及设置,可参考我的另一篇博文:http://blog.csdn.net/yhawaii/article/details/7789594
2、重写object的respondsToSelector方法
在iphone开发的时候EXC_BAD_ACCESS这个bug时不容易找到原因的。
首先说一下EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作,或者操作一个在循环代码中被修改的序列中的对象。虽然使用NSZombieEnabled变量可以帮助你找到问题所在,但有的时候,即使通过设置NSZombieEnabled变量,还是不能定位到问题所在,这个时候,你可以试试重写object的respondsToSelector方法,显示出现EXEC_BAD_ACCESS前访问的最后一个object,下面是具体的步骤:a、在每个类并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。的实现文件(.m,.mm)文件中,添加如下代码:
[cpp] view plaincopy
- -(BOOL) respondsToSelector : (SEL)aSelector {
- printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
- return [super respondsToSelector:aSelector];
- }
b、并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。
3、让XCode反馈足够多的信息
在Edit–>Scheme里面找到Arguments ,在Environment Variables这里添加
把下面2个值设置成YES
NSAutoreleaseFreedObjectCheckEnabled
NSDebugEnabled
这种方法非常好用,建议在建立一个工程的时候,加入此设置
4、设置全局异常断点
在程序抛出异常时候,往往需要定位到异常
键入快捷键 cmd + 6进入断点窗口,点击左下角的"+"按钮,选择弹出框的“Add Exception BreakPoint”项,如下图所示:
然后使用默认设置,点击"done"按钮,设置全局异常断点就完成了
分类:Cocoa开发
2012-01-31 16:02 9422人阅读评论(6) 收藏 举报
xcodecocoaexceptionprintingimmutablecrash
XCode的一些调试技巧
罗朝辉 (http://blog.csdn.net/kesalin/)
CC 许可,转载请注明出处
XCode 内置GDB,我们可以在命令行中使用GDB 命令来调试我们的程序。下面将介绍一些常用的命令以及调试技巧。
po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息)。
比如:
上图中,我使用 po命令显示一个 NSDictionary 的内容。注意在左侧我们可以看到 dict 的一些信息:3 key/value pairs,显示该 dict包含的数据量,而展开的信息显示 isa 层次体系(即class和 metaclass结构关系)。我们可以右击左侧的 dict,选中“Print Description of "dict"”,则可以在控制台输出 dict 的详细信息:
[cpp] view plaincopyprint?
- Printing description of dict:
- <CFBasicHash 0x1001149e0 [0x7fff7e27ff40]>{type = immutable dict, count = 3,
- entries =>
- 0 : <CFString 0x100002458 [0x7fff7e27ff40]>{contents = "first"} = <CFString 0x100002438 [0x7fff7e27ff40]>{contents = "one"}
- 1 : <CFString 0x100002498 [0x7fff7e27ff40]>{contents = "second"} = <CFString 0x100002478 [0x7fff7e27ff40]>{contents = "two"}
- 2 : <CFString 0x1000024d8 [0x7fff7e27ff40]>{contents = "third"} = <CFString 0x1000024b8 [0x7fff7e27ff40]>{contents = "three"}
- }
- (gdb)
print 命令:有点类似于格式化输出,可以输出对象的不同信息:
如:
[cpp] view plaincopyprint?
- (gdb) print (char *)[[dict description] cStringUsingEncoding:4]
- $1 = 0x1001159c0 "{\n first = one;\n second = two;\n third = three;\n}"
- (gdb) print (int)[dict retainCount]
- $2 = 1
- (gdb)
注:4是 NSUTF8StringEncoding的值。
info 命令:我们可以查看内存地址所在信息
比如 "info symbol内存地址"可以获取内存地址所在的 symbol 相关信息:
[cpp] view plaincopyprint?
- (gdb) info symbol 0x00000001000017f7
- main + 343 in section LC_SEGMENT.__TEXT.__text of /Users/LuoZhaohui/Library/Developer/Xcode/DerivedData/RunTimeSystem-anzdlhiwvlbizpfureuvenvmatnp/Build/Products/Debug/RunTimeSystem
比如 "info line *内存地址"可以获取内存地址所在的代码行相关信息:
[cpp] view plaincopyprint?
- (gdb) info line *0x00000001000017f7
- Line 62 of "/Users/LuoZhaohui/Documents/Study/RunTimeSystem/RunTimeSystem/main.m" starts at address 0x1000017f7 <main+343> and ends at 0x10000180a <main+362>.
show 命令:显示 GDB相关的信息。如:show version 显示GDB版本信息
[cpp] view plaincopyprint?
- (gdb) show version
- GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug 8 20:32:45 UTC 2011)
- Copyright 2004 Free Software Foundation, Inc.
- GDB is free software, covered by the GNU General Public License, and you are
- welcome to change it and/or distribute copies of it under certain conditions.
- Type "show copying" to see the conditions.
- There is absolutely no warranty for GDB. Type "show warranty" for details.
- This GDB was configured as "x86_64-apple-darwin".
help 命令:如果忘记某条命令的语法了,可以使用 help命令名 来获取帮助信息。如:help info显示 info 命令的用法。
[cpp] view plaincopyprint?
- (gdb) help info
- Generic command for showing things about the program being debugged.
- List of info subcommands:
- info address -- Describe where symbol SYM is stored
- info all-registers -- List of all registers and their contents
- info args -- Argument variables of current stack frame
- info auxv -- Display the inferior's auxiliary vector
- info breakpoints -- Status of user-settable breakpoints
- info catch -- Exceptions that can be caught in the current stack frame
- info checkpoints -- Help
- info classes -- All Objective-C classes
- ......
- Type "help info" followed by info subcommand name for full documentation.
- Command name abbreviations are allowed if unambiguous.
- (gdb)
在系统抛出异常处设置断点
有时候我们的程序不知道跑到哪个地方就 crash了,而 crash 又很难重现。保守的做法是在系统抛出异常之前设置断点,具体来说是在 objc_exception_throw处设置断点。设置步骤为:首先在 XCode按 CMD + 6,进入断点管理窗口;然后点击右下方的 +,增加新的 Symbolic Breakpoint,在 Symbol一栏输入:objc_exception_throw,然后点击 done,完成。 这样在 Debug模式下,如果程序即将抛出异常,就能在抛出异常处中断了。比如在前面的代码中,我让 [firstObjctcrashTest];抛出异常。在 objc_exception_throw 处设置断点之后,程序就能在该代码处中断了,我们从而知道代码在什么地方出问题了。