iOS 调试

关于出现僵尸信号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选项选AllBreak选项选OnThrow,然后再点击窗口底下的那个Done就搞定了…………有了这个就可以立刻查出错误在哪里



  • 有用
    3
    没用
    0

    骗仔黄
    创建 | 来源 | 2012-09-10 11:32:47
  • ?
    • 1
    • 进入楼上设置点击Xcode编辑面板,按下command + 6 即可进入,然后再设置!












    • 禁止某几个文件用ARC模式编译

      在一个支持ARCAutomatic Reference Counting)的项目中,有时候需要禁止其中几个文件使用ARC模式编译(比如你用了第三方不支持ARC的类库)。

      ?

      1

      2

      3

      4

      /*

      在要禁止ARC编译的源文件的 “compiler flags”中添加 “-fno-objc-arc” 

      对于 Xcode 4,可以在 target -> Build Phases -> Compile Sources中找到“compiler flags”

      */
















      ARCARC之间的转换方法

      ?

      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); 















    XCODE调试技巧集锦

    分类:iOS开发之基础篇

    2012-08-28 10:24 599人阅读评论(0) 收藏 举报

    xcodeobjectaccessvariablesexceptionscheme


    目录(?)

    [+]


    前记:编写代码过程中,出现错误、异常是不可避免的,这个时候,就体现了调试的重要性,下面就总结一下,平常我自己使用的一些调试技巧,以及汇总网络上其他网友使用的技巧。(ps以后有新的调试技巧,我也会一并更新)


    1、使用僵尸变量(NSZombieEnabled)


    具体使用及设置,可参考我的另一篇博文:http://blog.csdn.net/yhawaii/article/details/7789594

    2、重写objectrespondsToSelector方法


    iphone开发的时候EXC_BAD_ACCESS这个bug时不容易找到原因的。


    首先说一下EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作,或者操作一个在循环代码中被修改的序列中的对象。虽然使用NSZombieEnabled变量可以帮助你找到问题所在,但有的时候,即使通过设置NSZombieEnabled变量,还是不能定位到问题所在,这个时候,你可以试试重写objectrespondsToSelector方法,显示出现EXEC_BAD_ACCESS前访问的最后一个object,下面是具体的步骤:

    a、在每个类并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcodeconsole上就会准确地记录了最后运行的object的方法。的实现文件(.m,.mm)文件中,添加如下代码:


    [cpp] view plaincopy


    1. -(BOOL) respondsToSelector : (SEL)aSelector {  
    2.     printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);  
    3.     return [super respondsToSelector:aSelector];  
    4. }  



    b、并且在 other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcodeconsole上就会准确地记录了最后运行的object的方法。



    3、让XCode反馈足够多的信息



    Edit–>Scheme里面找到Arguments ,Environment Variables这里添加
    把下面2个值设置成YES
    NSAutoreleaseFreedObjectCheckEnabled
    NSDebugEnabled
    这种方法非常好用,建议在建立一个工程的时候,加入此设置


    4、设置全局异常断点


    在程序抛出异常时候,往往需要定位到异常

    键入快捷键 cmd + 6进入断点窗口,点击左下角的"+"按钮,选择弹出框的“Add Exception BreakPoint”项,如下图所示:

    1346121322_9328.png

    然后使用默认设置,点击"done"按钮,设置全局异常断点就完成了














































    [Cocoa]XCode的一些调试技巧

    分类:Cocoa开发

    2012-01-31 16:02 9422人阅读评论(6) 收藏 举报

    xcodecocoaexceptionprintingimmutablecrash

    XCode的一些调试技巧

    罗朝辉 (http://blog.csdn.net/kesalin/)

    CC 许可,转载请注明出处

    XCode 内置GDB,我们可以在命令行中使用GDB 命令来调试我们的程序。下面将介绍一些常用的命令以及调试技巧。

    po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息)。

    比如:
    0_1327994072C885.gif.png

    上图中,我使用 po命令显示一个 NSDictionary 的内容。注意在左侧我们可以看到 dict 的一些信息:3 key/value pairs,显示该 dict包含的数据量,而展开的信息显示 isa 层次体系(即class metaclass结构关系)。我们可以右击左侧的 dict,选中“Print Description of "dict"”,则可以在控制台输出 dict 的详细信息:

    [cpp] view plaincopyprint?


    1. Printing description of dict:  
    2. <CFBasicHash 0x1001149e0 [0x7fff7e27ff40]>{type = immutable dict, count = 3,  
    3. entries =>  
    4.     0 : <CFString 0x100002458 [0x7fff7e27ff40]>{contents = "first"} = <CFString 0x100002438 [0x7fff7e27ff40]>{contents = "one"}  
    5.     1 : <CFString 0x100002498 [0x7fff7e27ff40]>{contents = "second"} = <CFString 0x100002478 [0x7fff7e27ff40]>{contents = "two"}  
    6.     2 : <CFString 0x1000024d8 [0x7fff7e27ff40]>{contents = "third"} = <CFString 0x1000024b8 [0x7fff7e27ff40]>{contents = "three"}  
    7. }  
    8. (gdb)   


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

    如:

    [cpp] view plaincopyprint?


    1. (gdb) print (char *)[[dict description] cStringUsingEncoding:4]  
    2. $1 = 0x1001159c0 "{\n    first = one;\n    second = two;\n    third = three;\n}"  
    3. (gdb) print (int)[dict retainCount]  
    4. $2 = 1  
    5. (gdb)   


    注:4 NSUTF8StringEncoding的值。

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

    比如 "info symbol内存地址"可以获取内存地址所在的 symbol 相关信息:

    [cpp] view plaincopyprint?


    1. (gdb) info symbol 0x00000001000017f7  
    2. 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?


    1. (gdb) info line *0x00000001000017f7  
    2. 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?


    1. (gdb) show version  
    2. GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)  
    3. Copyright 2004 Free Software Foundation, Inc.  
    4. GDB is free software, covered by the GNU General Public License, and you are  
    5. welcome to change it and/or distribute copies of it under certain conditions.  
    6. Type "show copying" to see the conditions.  
    7. There is absolutely no warranty for GDB.  Type "show warranty" for details.  
    8. This GDB was configured as "x86_64-apple-darwin".  


    help 命令:如果忘记某条命令的语法了,可以使用 help命令名 来获取帮助信息。如:help info显示 info 命令的用法。

    [cpp] view plaincopyprint?


    1. (gdb) help info  
    2. Generic command for showing things about the program being debugged.  
    3.   
    4. List of info subcommands:  
    5.   
    6. info address -- Describe where symbol SYM is stored  
    7. info all-registers -- List of all registers and their contents  
    8. info args -- Argument variables of current stack frame  
    9. info auxv -- Display the inferior's auxiliary vector  
    10. info breakpoints -- Status of user-settable breakpoints  
    11. info catch -- Exceptions that can be caught in the current stack frame  
    12. info checkpoints -- Help  
    13. info classes -- All Objective-C classes  
    14. ......  
    15.   
    16. Type "help info" followed by info subcommand name for full documentation.  
    17. Command name abbreviations are allowed if unambiguous.  
    18. (gdb)   

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

    有时候我们的程序不知道跑到哪个地方就 crash了,而 crash 又很难重现。保守的做法是在系统抛出异常之前设置断点,具体来说是在 objc_exception_throw处设置断点。设置步骤为:首先在 XCode CMD + 6,进入断点管理窗口;然后点击右下方的 +,增加新的 Symbolic Breakpoint,在 Symbol一栏输入:objc_exception_throw然后点击 done,完成。 这样在 Debug模式下,如果程序即将抛出异常,就能在抛出异常处中断了。比如在前面的代码中,我让 [firstObjctcrashTest];抛出异常。在 objc_exception_throw 处设置断点之后,程序就能在该代码处中断了,我们从而知道代码在什么地方出问题了。

    0_1327996095ja0D.gif.png
     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值