OStack程序员社区-中国程序员成长平台

标题: ios - 在 xcode 5 中隐藏 "*** First throw call stack" [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 05:53
标题: ios - 在 xcode 5 中隐藏 "*** First throw call stack"

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

TestProject[31643:70b] *** 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.'

但它总是抛出调用堆栈。我必须向上滚动才能看到上面的日志。 这很烦人,因为我的 macbook 是 13 英寸的 macbook。如何隐藏下面的调用堆栈?

*** First throw call stack:
(
    0   CoreFoundation                      0x0174f5e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x014be8b6 objc_exception_throw + 44
    2   UIKit                               0x00b95ca5 -[UIStoryboardPushSegue destinationContainmentContext] + 0
    3   UIKit                               0x00b8607e -[UIStoryboardSegueTemplate _perform:] + 174
    4   UIKit                               0x00767280 -[UIViewController performSegueWithIdentifier:sender:] + 72
    5   UIKit                               0x0e1b508c -[UIViewControllerAccessibility(SafeCategory) performSegueWithIdentifier:sender:] + 63
    6   TestProject                         0x00002bd9 -[ViewController imagePickerController:didFinishPickingMediaWithInfo:] + 345
    7   UIKit                               0x008c9e7e -[UIImagePickerController _imagePickerDidCompleteWithInfo:] + 506
    8   PhotoLibrary                        0x0ee7fe94 PLNotifyImagePickerOfImageAvailability + 106
    9   PhotosUI                            0x11015585 -[PUUIPhotosAlbumViewController handleNavigateToAsset:inContainer:] + 401
    10  PhotosUI                            0x10f987b4 -[PUPhotosGridViewController collectionView:shouldSelectItemAtIndexPath:] + 577
    11  UIKit                               0x00c61c0b -[UICollectionView _selectItemAtIndexPath:animated:scrollPosition:notifyDelegate:] + 173
    12  UIKit                               0x00c7a1f8 -[UICollectionView _userSelectItemAtIndexPath:] + 189
    13  UIKit                               0x00c7a3b5 -[UICollectionView touchesEnded:withEvent:] + 437
    14  libobjc.A.dylib                     0x014d0874 -[NSObject performSelector:withObject:withObject:] + 77
    15  UIKit                               0x007aa902 forwardTouchMethod + 271
    16  UIKit                               0x007aa972 -[UIResponder touchesEnded:withEvent:] + 30
    17  libobjc.A.dylib                     0x014d0874 -[NSObject performSelector:withObject:withObject:] + 77
    18  UIKit                               0x007aa902 forwardTouchMethod + 271
    19  UIKit                               0x007aa972 -[UIResponder touchesEnded:withEvent:] + 30
    20  libobjc.A.dylib                     0x014d0874 -[NSObject performSelector:withObject:withObject:] + 77
    21  UIKit                               0x007aa902 forwardTouchMethod + 271
    22  UIKit                               0x007aa972 -[UIResponder touchesEnded:withEvent:] + 30
    23  UIKit                               0x009c5c7f _UIGestureRecognizerUpdate + 7166
    24  UIKit                               0x0069019a -[UIWindow _sendGesturesForEvent:] + 1291
    25  UIKit                               0x006910ba -[UIWindow sendEvent:] + 1030
    26  UIKit                               0x00664e86 -[UIApplication sendEvent:] + 242
    27  UIKit                               0x0064f18f _UIApplicationHandleEventQueue + 11421
    28  CoreFoundation                      0x016d883f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    29  CoreFoundation                      0x016d81cb __CFRunLoopDoSources0 + 235
    30  CoreFoundation                      0x016f529e __CFRunLoopRun + 910
    31  CoreFoundation                      0x016f4ac3 CFRunLoopRunSpecific + 467
    32  CoreFoundation                      0x016f48db CFRunLoopRunInMode + 123
    33  GraphicsServices                    0x034b29e2 GSEventRunModal + 192
    34  GraphicsServices                    0x034b2809 GSEventRun + 104
    35  UIKit                               0x00651d3b UIApplicationMain + 1225
    36  TestProject                         0x0000237d main + 141
    37  libdyld.dylib                       0x01d7970d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException



Best Answer-推荐答案


在 x86 模拟器中解决此问题的最简单方法是添加异常断点并对其进行编辑以在中断时输出 $eax,因为 $eax 将包含异常原因。这样,当发生异常时,您可以将原因作为最后一个控制台输出来查看,并能够在调用堆栈中导航以寻找线索。

除此之外,您可以尝试调整 -[NSException callStackReturnAddresses] 以返回一个空数组。


更新

由于 $eax 仅适用于 x86 模拟器,因此对于 64 位模拟器和设备,您需要稍微不同的机制。一种方法是跳到第 0 帧 (objc_exception_throw) 并在堆栈中搜索指向原因的内存地址。通过一些尝试和错误,我发现 32 位模拟器在 (*((id*)$esp+8)) 有它,而 64 位模拟器在 有它(*((id*)$rsp+7))。这对于 -[NSException raise]+[NSException raise:format:] 调用都是一致的。我明天会检查设备。


更新 2

事实证明这要容易得多。异常总是在平台的第一个寄存器上:

我不知道 arm64 的约定,但异常可能存在于第一个 64 位寄存器上。如果你只是要在一个平台上调试,你可以只使用一个异常。如果您要调试多个平台,您可以为每个接受添加一个操作,您将收到一些关于未知寄存器的错误消息,但它们应该仍然适合您的屏幕而不需要滚动:

enter image description here

关于ios - 在 xcode 5 中隐藏 "*** First throw call stack",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934976/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4