在 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
在 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
事实证明这要容易得多。异常总是在平台的第一个寄存器上:
$eax
$rax
$r0
我不知道 arm64 的约定,但异常可能存在于第一个 64 位寄存器上。如果你只是要在一个平台上调试,你可以只使用一个异常。如果您要调试多个平台,您可以为每个接受添加一个操作,您将收到一些关于未知寄存器的错误消息,但它们应该仍然适合您的屏幕而不需要滚动:
关于ios - 在 xcode 5 中隐藏 "*** First throw call stack",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934976/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |