2014-01-05 13 views
2

Xcode 5에서 디버깅 할 때 호출 스택을 숨기고 오류 로그 만 표시하거나 수동으로 켜고 끄는 방법이 있습니까? 오류 로그는 다음과 같습니다 :xcode에서 "*** First throw call stack"을 숨기기 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.' 

그러나 항상 호출 스택을 던집니다. 위의 로그를 보려면 위로 스크롤해야합니다. 제 맥북이 13inch 맥북이기 때문에 짜증이납니다. 아래의 호출 스택을 어떻게 숨길 수 있습니까?

*** 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 
+4

고맙다. 많은 사람들이 Xcode의 이상 함으로 인해 호출 스택을 안정적으로 가져올 수 없습니다.그리고 당신이 그것을 필요로 할 때 (그것은 종종 있습니다), 당신은 정말로 그것을 필요로합니다. –

+0

수동으로 켜고 끌 수 있다면 좋을 것 같습니다. @ HotLicks – johnMa

답변

1

아니요 스택 추적을 끌 수 있다고 생각하지 않습니다.

진실은 당신을 '화나게하는 것'만큼 문제를 디버그하는 데 도움이된다는 것입니다. 스택 추적이 없으면 이렇게하는 것이 훨씬 더 어려울 것입니다.

+1

네, 문제를 디버깅하는 데 도움이 될 수 있지만 실제로 오류 로그 first.thanks를 보려는 답장을 보내고 싶지만 실제로는 그렇지 않습니다. 내가 원하는거야. – johnMa

3

x86 시뮬레이터에서 가장 간단한 방법은 $ eax에 예외 이유가 포함되어 있기 때문에 예외 중단 점을 추가하고 코드를 편집하여 $eax을 출력하는 것입니다. 이렇게하면 예외가 발생하면 이유를 마지막 콘솔 출력으로 볼 수 있고 단서를 찾기 위해 호출 스택을 탐색 할 수 있습니다.

그 외에도 -[NSException callStackReturnAddresses]을 사용하여 빈 배열을 반환 할 수 있습니다.


업데이트

$eax 만 86 시뮬레이터에서 작동하기 때문에, 당신은 64 비트 시뮬레이터 및 장치에 대한 약간 다른 메커니즘이 필요합니다. 이를 수행하는 한 가지 방법은 프레임 0 (objc_exception_throw)으로 건너 뛰고 이유를 가리키는 메모리 주소에 대한 스택을 다시 검색하는 것입니다. 약간의 시행 착오를 거쳐 32 비트 시뮬레이터는 (*((id*)$esp+8))에 있고, 64 비트 시뮬레이터는 (*((id*)$rsp+7))에 있습니다. 이는 -[NSException raise]+[NSException raise:format:] 호출에 대해 일관됩니다. 나는 내일 장치를 점검 할 것이다.


업데이트 2

는 훨씬 쉽게 밝혀졌습니다.

  • 32 비트 시뮬레이터 :$eax
  • 64 비트 시뮬레이터 :
  • 32 비트 장치$r0
  • 예외는 플랫폼의 제 1 레지스터에 항상

arm64에 대한 규칙을 모르지만 예외는 아마 첫 번째 64 비트 레지스터. 하나의 플랫폼에서만 디버깅을한다면, 하나의 예외를 사용할 수 있습니다. 여러 플랫폼을 디버깅 위하여려고하는 경우에, 스크롤하지 않고 각 당신이 알 수없는 레지스터에 대한 몇 가지 오류 메시지를 얻을 것이다 것을 수용하기위한 조치를 추가 할 수 있습니다,하지만 그들은 모두 여전히 화면에 표시해야합니다

enter image description here

+0

'$ eax'는 x86 아키텍처 (32 비트 iOS 시뮬레이터)에서만 작동합니다. –

+0

@BryanChen이 문제를 해결하는 주석을 추가했습니다. 나는 64 비트 시뮬레이터를 편리하게 사용하여 스택 포인터를 추적했지만, 내일 arm32를 얻을 수있을 것이다. –

+0

레지스터에서 일반적인 오류 로그를 가져 오는 방법은 무엇입니까? 감사합니다. 작동 원리를 파악하자마자이를 수락합니다. – johnMa