4

在 Xcode 中添加符号断点会为您提供-[NSException raise]. 我想做同样的事情,但特别是在-[NSRangeException raise]. 原因是我只想在特定的数组边界异常上设置断点例如:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 31 beyond bounds [0 .. 30]'

是的,我知道我可以添加一个捕获所有异常断点。但是,我不想这样做,因为我不想在整个使用应用程序时生成的许多异常上设置断点。

根据与NSException. 但是,我还没有找到任何可以成功运行的东西。

例如我试过:

在此处输入图像描述

这个日记条目也很有趣,尽管没有定论:

处理 NSArray “越界”

所以,基本上,问题是,在 Xcode 中,如何专门且仅在范围异常上设置断点?

4

2 回答 2

6

NSRangeException 不是一个类:

grep NSRangeException /System/Library/Frameworks/Foundation.framework/Headers/NSException.h FOUNDATION_EXPORT NSString * const NSRangeException;

原来,范围异常只是名称为 NSRangeException 的 NSException,即:

(lldb) b s -n objc_exception_throw
Breakpoint 2: where = libobjc.A.dylib`objc_exception_throw, address = 0x00007fff8e3c2e4a
(lldb) c
Process 58216 resuming
Process 58216 stopped
* thread #1: tid = 0x1d7f4b, function: objc_exception_throw , stop reason = breakpoint 2.1
    frame #0: 0x00007fff8e3c2e4a libobjc.A.dylib`objc_exception_throw
libobjc.A.dylib`objc_exception_throw:
-> 0x7fff8e3c2e4a:  pushq  %rbp
   0x7fff8e3c2e4b:  movq   %rsp, %rbp
   0x7fff8e3c2e4e:  pushq  %r15
   0x7fff8e3c2e50:  pushq  %r14
(lldb) bt 
* thread #1: tid = 0x1d7f4b, function: objc_exception_throw , stop reason = breakpoint 2.1
    frame #0: 0x00007fff8e3c2e4a libobjc.A.dylib`objc_exception_throw
    frame #1: 0x00007fff841ca1df CoreFoundation`-[__NSArrayI objectAtIndex:]
    frame #2: 0x0000000100000eb9 range-exception`-[Foo throwIt] at range-exception.m:14
    frame #3: 0x0000000100000f27 range-exception`main at range-exception.m:22
    frame #4: 0x00007fff8468d5fd libdyld.dylib`start
    frame #5: 0x00007fff8468d5fd libdyld.dylib`start
(lldb) expr (NSString *) [((NSException *) $arg1) name]
(NSString *) $0 = 0x00007fff74177990 @"NSRangeException"

因此,您可以在 objc_exception_throw 上设置断点,并编写一个断点条件,将名称与 NSRangeException 进行比较。就像是:

[(NSString *) [((NSException *) $arg1) name] isEqual: (NSString *) NSRangeException]

应该做的伎俩。

于 2013-10-14T23:05:35.223 回答
2

要为 设置断点NSRangeException,请使用异常断点。它是您单击断点导航器中的“+”时的选项之一。从这个答案中找到了这个信息:https ://stackoverflow.com/a/9718552/591487

于 2015-12-29T15:58:33.730 回答