简体   繁体   English

在XCode中调试:异常断点

[英]Debugging in XCode: Exception Breakpoints

I'm debugging a random SIGTRAP crash right now that just happens in the background. 我正在调试一个随机的SIGTRAP崩溃,这​​只是在后台发生。 It's probably something that has to do with an NSManagedObjectContext somewhere. 它可能与某处的NSManagedObjectContext

Besides that, I'm trying to debug it using an exception breakpoint to at least find out where it's originating from. 除此之外,我正在尝试使用异常断点对其进行调试,以至少找出它的起源。 The only problem is that the crash/breakpoint occurs in a 0 objc_exception_throw, which is no help to me. 唯一的问题是崩溃/断点发生在0 objc_exception_throw中,这对我没有帮助。

The data I get back looks like this: 我得到的数据如下所示:

libobjc.A.dylib`objc_exception_throw:
0x32a3a960:  push   {r4, r5, r6, r7, lr} // breakpoint stops here
0x32a3a962:  add    r7, sp, #12
0x32a3a964:  mov    r4, r0
0x32a3a966:  movs   r0, #16
0x32a3a968:  blx    0x32a46854                ; symbol stub for: -[NSObject isEqual:]

So my question is, how I can I create an exception breakpoint to initiate itself earlier? 所以我的问题是,如何创建一个异常断点来提前启动? I'm trying to make the breakpoint occur in the last bit of actual Objective-C code before the crash. 我试图让断点发生在崩溃前的实际Objective-C代码的最后一点。

I have tried editing the breakpoint to be shared, break on throw, then break on catch, and have changed the type of exception between Objective-C, C++, and "all" with no luck. 我已经尝试编辑要共享的断点,中断抛出,然后中断catch,并且在没有运气的情况下更改了Objective-C,C ++和“all”之间的异常类型。

How can I make the exception breakpoint throw earlier? 我怎样才能使异常断点更早出现?

Unless there is a way to decipher the code I posted. 除非有办法破译我发布的代码。 If that's possible, please give me a brief explanation of what it means, and how you deciphered it so I can learn to do so as well :) 如果可能的话,请给我一个简短的解释,说明它意味着什么,以及你如何破译它以便我也可以学习这样做:)

Thanks everyone! 感谢大家!

If I let the program run... 如果我让程序运行...

It continues to the crash, which looks like this: 它继续崩溃,看起来像这样:

libsystem_kernel.dylib`mach_msg_trap:
0x30830ea0:  mov    r12, sp
0x30830ea4:  push   {r4, r5, r6, r8}
0x30830ea8:  ldm    r12, {r4, r5, r6}
0x30830eac:  mvn    r12, #30
0x30830eb0:  svc    #128
0x30830eb4:  pop    {r4, r5, r6, r8} // SIGTRAP throws here
0x30830eb8:  bx     lr

Stack trace when running command "bt" as a debugger command 运行命令“bt”作为调试器命令时的堆栈跟踪

* thread #13: tid = 0x2337, 0x32a3a960 libobjc.A.dylib`objc_exception_throw, stop reason = breakpoint 1.1
    frame #0: 0x32a3a960 libobjc.A.dylib`objc_exception_throw
    frame #1: 0x340f9fee CoreData`-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 298
    frame #2: 0x341522d2 CoreData`-[NSManagedObjectContext save:] + 730
    frame #3: 0x32054b02 UIKit`__84-[UIManagedDocument writeContents:toURL:forSaveOperation:originalContentsURL:error:]_block_invoke_0 + 30
    frame #4: 0x34155bc0 CoreData`developerSubmittedBlockToNSManagedObjectContextPerform + 88
    frame #5: 0x36e3d4b6 libdispatch.dylib`_dispatch_client_callout + 22
    frame #6: 0x36e419f6 libdispatch.dylib`_dispatch_barrier_sync_f_invoke + 30
    frame #7: 0x34155d42 CoreData`-[NSManagedObjectContext performBlockAndWait:] + 174
    frame #8: 0x32054862 UIKit`-[UIManagedDocument writeContents:toURL:forSaveOperation:originalContentsURL:error:] + 986
    frame #9: 0x3205418a UIKit`-[UIManagedDocument writeContents:andAttributes:safelyToURL:forSaveOperation:error:] + 698
    frame #10: 0x32017ce4 UIKit`__block_global_4 + 68
    frame #11: 0x32017c80 UIKit`__block_global_3 + 156
    frame #12: 0x339c767c Foundation`-[NSFileCoordinator _invokeAccessor:thenCompletionHandler:] + 144
    frame #13: 0x339c791e Foundation`__73-[NSFileCoordinator coordinateWritingItemAtURL:options:error:byAccessor:]_block_invoke_0 + 90
    frame #14: 0x339c894e Foundation`-[NSFileCoordinator(NSPrivate) _invokeAccessor:orDont:thenRelinquishAccessClaimForID:] + 202
    frame #15: 0x339c926c Foundation`-[NSFileCoordinator(NSPrivate) _coordinateWritingItemAtURL:options:error:byAccessor:] + 548
    frame #16: 0x339c78be Foundation`-[NSFileCoordinator coordinateWritingItemAtURL:options:error:byAccessor:] + 90
    frame #17: 0x32017254 UIKit`-[UIDocument _coordinateWritingItemAtURL:error:byAccessor:] + 720
    frame #18: 0x320179a0 UIKit`__59-[UIDocument saveToURL:forSaveOperation:completionHandler:]_block_invoke_0 + 284
    frame #19: 0x36e3e11e libdispatch.dylib`_dispatch_call_block_and_release + 10
    frame #20: 0x36e41ece libdispatch.dylib`_dispatch_queue_drain$VARIANT$mp + 142
    frame #21: 0x36e41dc0 libdispatch.dylib`_dispatch_queue_invoke$VARIANT$mp + 40
    frame #22: 0x36e4291c libdispatch.dylib`_dispatch_root_queue_drain + 184
    frame #23: 0x36e42ac0 libdispatch.dylib`_dispatch_worker_thread2 + 84
    frame #24: 0x33ba7a10 libsystem_c.dylib`_pthread_wqthread + 360
    frame #25: 0x33ba78a4 libsystem_c.dylib`start_wqthread + 8

Check out the link that Matt Wilding posted in the comments of his answer! 查看Matt Wilding在他的回答评论中发布的链接!

You don't have much control over where that breakpoint triggers. 您无法控制断点触发的位置。 Once you've hit the breakpoint though, you can use the bt command to print the current stack trace. 但是,一旦达到断点,就可以使用bt命令打印当前的堆栈跟踪。


EDIT: With the backtrace... 编辑:随着回溯......

It looks like UIDocument's -saveToURL:forSaveOperation:completionHandler: method is the culprit. 它看起来像UIDocument的-saveToURL:forSaveOperation:completionHandler:方法是罪魁祸首。 I've never used the class before, so I can't help too much. 我以前从未使用过这门课,所以我不能帮助太多。 If you're calling that method anywhere in your code (like from a block?), you could also put a breakpoint there, in anticipation of the failure. 如果你在代码中的任何地方调用那个方法(比如从一个块?),你也可以在那里放一个断点,以防止失败。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM