【问题标题】:Can i make an Xcode breakpoint when a certain class gets added to autorelease pool?当某个类被添加到自动释放池时,我可以创建一个 Xcode 断点吗?
【发布时间】:2013-11-03 20:52:38
【问题描述】:

我正在尝试调试一些 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

【问题讨论】:

标签: ios objective-c xcode xcode5 autorelease


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这看起来很棒!知道模拟器上接收对象的寄存器是什么吗?
  • $rdi, @Chris。格雷格帕克有a table with all the architectures
  • 我认为它实际上可能是 $eax?
  • 我的控制台出现以下错误:error: use of undeclared identifier '$rdi'
  • 在 32 位 x86 架构上,它是 (BOOL)[((id*)$esp)[1] isKindOfClass:[NSArray class]]
猜你喜欢
  • 2015-12-19
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多