菜鸟教程小白 发表于 2022-12-13 05:53:57

ios - 在 xcode 5 中隐藏 "*** First throw call stack"


                                            <p><p>在 Xcode 5 中调试时,有没有办法隐藏调用堆栈并仅显示错误日志,或者手动打开和关闭它?我只想要这样的错误日志:</p>

<pre><code>TestProject *** Terminating app due to uncaught exception &#39;NSGenericException&#39;, reason: &#39;Could not find a navigation controller for segue &#39;SecondViewController&#39;. Push segues can only be used when the source controller is managed by an instance of UINavigationController.&#39;
</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 中隐藏&#34;*** First throw call stack&#34;,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/20934976/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/20934976/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 xcode 5 中隐藏 &#34;*** First throw call stack&#34;