5

我正在尝试调试一些 ARC 代码,如果我能找出某个类的对象何时添加到自动释放池中(而不是它实际上是在轨道上自动释放时),那将非常有帮助。

这可能吗,例如使用断点?或者通过覆盖'autorelease'方法并在其中放置一个断点?有什么建议么?

- 编辑 -

问题是我在后台线程上自动释放 UIView 的自定义子类时发生了罕见的崩溃,该崩溃是因为 UIView 无法在后台线程上解除锁定。跟踪如下所示:

0    libsystem_kernel.dylib  __pthread_kill + 8
1    libsystem_c.dylib   pthread_kill + 54
2    libsystem_c.dylib   abort + 94
3    libc++abi.dylib     abort_message + 46
4    libc++abi.dylib     default_terminate() + 24
5    libobjc.A.dylib     _objc_terminate + 146
6    libc++abi.dylib     safe_handler_caller(void (*)()) + 76
7    libc++abi.dylib     operator delete(void*)
8    libc++abi.dylib     __cxa_throw + 122
9    libobjc.A.dylib     objc_exception_throw + 94
10   CoreFoundation  +[NSException raise:format:]
11   Foundation  -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 90
12   MYAPP   MySuperclass.m line 156 -[MySuperclass dealloc]
13   MYAPP  MyClass.m line 41 -[MyClass dealloc]
14 ...   libobjc.A.dylib     _objc_rootRelease + 36
15   libobjc.A.dylib     objc_release + 38
16   libobjc.A.dylib     (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 224
17   libobjc.A.dylib     _objc_autoreleasePoolPop + 12
18   CoreFoundation  _CFAutoreleasePoolPop + 18
19   libdispatch.dylib   _dispatch_worker_thread2 + 338
20   libsystem_c.dylib   _pthread_wqthread + 294
4

1 回答 1

7

这可能对您的问题没有帮助,但我认为它回答了您最初的问题:

你可以添加一个符号断点[NSObject autorelease],然后设置一个条件来匹配你的类。如果您在设备上运行$r0应该持有指向接收对象的指针。您需要进行一些强制转换以使条件起作用:(BOOL)[(id)$r0 isKindOfClass:[NSArray class]]每当将 anNSArray添加到自动释放池时就会中断。请注意,由于调试器必须在每次自动释放时中断并检查条件,所以一切都会运行得很慢。

添加符号断点

在此处输入图像描述

在此处输入图像描述

于 2013-10-24T22:52:07.277 回答