ios - 在 xcode 5 中隐藏 "*** First throw call stack"
<p><p>在 Xcode 5 中调试时,有没有办法隐藏调用堆栈并仅显示错误日志,或者手动打开和关闭它?我只想要这样的错误日志:</p>
<pre><code>TestProject *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'SecondViewController'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'
</code></pre>
<p>但它总是抛出调用堆栈。我必须向上滚动才能看到上面的日志。
这很烦人,因为我的 macbook 是 13 英寸的 macbook。如何隐藏下面的调用堆栈?</p>
<pre><code>*** First throw call stack:
(
0 CoreFoundation 0x0174f5e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x014be8b6 objc_exception_throw + 44
2 UIKit 0x00b95ca5 - + 0
3 UIKit 0x00b8607e - + 174
4 UIKit 0x00767280 - + 72
5 UIKit 0x0e1b508c - + 63
6 TestProject 0x00002bd9 - + 345
7 UIKit 0x008c9e7e - + 506
8 PhotoLibrary 0x0ee7fe94 PLNotifyImagePickerOfImageAvailability + 106
9 PhotosUI 0x11015585 - + 401
10PhotosUI 0x10f987b4 - + 577
11UIKit 0x00c61c0b - + 173
12UIKit 0x00c7a1f8 - + 189
13UIKit 0x00c7a3b5 - + 437
14libobjc.A.dylib 0x014d0874 - + 77
15UIKit 0x007aa902 forwardTouchMethod + 271
16UIKit 0x007aa972 - + 30
17libobjc.A.dylib 0x014d0874 - + 77
18UIKit 0x007aa902 forwardTouchMethod + 271
19UIKit 0x007aa972 - + 30
20libobjc.A.dylib 0x014d0874 - + 77
21UIKit 0x007aa902 forwardTouchMethod + 271
22UIKit 0x007aa972 - + 30
23UIKit 0x009c5c7f _UIGestureRecognizerUpdate + 7166
24UIKit 0x0069019a - + 1291
25UIKit 0x006910ba - + 1030
26UIKit 0x00664e86 - + 242
27UIKit 0x0064f18f _UIApplicationHandleEventQueue + 11421
28CoreFoundation 0x016d883f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
29CoreFoundation 0x016d81cb __CFRunLoopDoSources0 + 235
30CoreFoundation 0x016f529e __CFRunLoopRun + 910
31CoreFoundation 0x016f4ac3 CFRunLoopRunSpecific + 467
32CoreFoundation 0x016f48db CFRunLoopRunInMode + 123
33GraphicsServices 0x034b29e2 GSEventRunModal + 192
34GraphicsServices 0x034b2809 GSEventRun + 104
35UIKit 0x00651d3b UIApplicationMain + 1225
36TestProject 0x0000237d main + 141
37libdyld.dylib 0x01d7970d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>在 x86 模拟器中解决此问题的最简单方法是添加异常断点并对其进行编辑以在中断时输出 <code>$eax</code>,因为 $eax 将包含异常原因。这样,当发生异常时,您可以将原因作为最后一个控制台输出来查看,并能够在调用堆栈中导航以寻找线索。</p>
<p>除此之外,您可以尝试调整 <code>-</code> 以返回一个空数组。</p>
<hr/>
<p><strong>更新</strong></p>
<p>由于 <code>$eax</code> 仅适用于 x86 模拟器,因此对于 64 位模拟器和设备,您需要稍微不同的机制。一种方法是跳到第 0 帧 (<code>objc_exception_throw</code>) 并在堆栈中搜索指向原因的内存地址。通过一些尝试和错误,我发现 32 位模拟器在 <code>(*((id*)$esp+8))</code> 有它,而 64 位模拟器在 <code> 有它(*((id*)$rsp+7))</code>。这对于 <code>-</code> 和 <code>+</code> 调用都是一致的。我明天会检查设备。</p>
<hr/>
<p><strong>更新 2</strong></p>
<p>事实证明这要容易得多。异常总是在平台的第一个寄存器上:</p>
<ul>
<li><strong>32 位模拟器:</strong> <code>$eax</code></li>
<li><strong>64 位模拟器:</strong> <code>$rax</code></li>
<li><strong>32 位设备:</strong> <code>$r0</code></li>
</ul>
<p>我不知道 arm64 的约定,但异常可能存在于第一个 64 位寄存器上。如果你只是要在一个平台上调试,你可以只使用一个异常。如果您要调试多个平台,您可以为每个接受添加一个操作,您将收到一些关于未知寄存器的错误消息,但它们应该仍然适合您的屏幕而不需要滚动:</p>
<p> <img src="/image/2ydUT.png" alt="enter image description here"/> </p></p>
<p style="font-size: 20px;">关于ios - 在 xcode 5 中隐藏"*** First throw call stack",我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/20934976/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/20934976/
</a>
</p>
页:
[1]