xcode之-[NSRangeException raise] 上的符号异常断点

insus 阅读:94 2025-06-02 22:19:02 评论:0

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

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

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

我已经根据与 NSException 相关的其他帖子尝试了很多方法。 .但是,我还没有发现任何成功的东西。

例如我试过:



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

Dealing with NSArray "out of bounds"

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

请您参考如下方法:

NSRangeException 不是一个类:

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



事实证明,范围异常只是名称为 NSRangeException 的 NSExceptions,即:
(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] 

应该做的伎俩。


标签:Exception
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号