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

在网上看到一些方法, 试了一下, 效果不理想, 不过还是记在这里如果遇到系统抛出异常时可以死马当活马医。

环境设置:

先随便新建一个项目, 在viewDidLoad中写如下代码:

- (void)viewDidLoad

{

    [super viewDidLoad];


    NSString *str = [NSString stringWithFormat:@"Hello"];

    

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    btn.frame = CGRectMake(50, 50, 200, 40);

    [self.view addSubview:btn];

    

    [str release];

    

    NSLog(@"happy.");

}

运行, 程序会崩溃,因为上面的str是不能被release的, 但是程序并没有在这里停住,以表示是在这里崩溃的, 而是在main()函数中, 并且从崩溃时的堆栈中也没有看到有说执行到哪里才崩溃的,堆栈信息如图:


再上Console打印的信息如下:

GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Thu Nov  3 21:59:02 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".sharedlibrary apply-load-rules all

Attaching to process 498.

Pending breakpoint 1 - "objc_exception_throw" resolved

2012-06-14 11:17:25.829 steisnio[498:f803] happy.

(gdb) 


如果你想根据Console信息来找, 恐怕就会偏离方向, 因为console显示, happy居然被正常打印出来了, 按惯常逻辑, 打印出happy就意味着程序是执行过 NSLog(@"happy.");  都还没有报错 , 事实上确不是这样子的。 


按网上的方法

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


做了后, 发现一样的, 程序还是停在main()那里, 并且堆栈信息也没有因此而显示更多的信息。 

当然网上这个办法在某些情况下应该也能解决一些问题, 所以权当死马当活马医吧。

如果有高人路过, 可否告知为什么在我的试验中这是行不能的。先谢谢了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值