2009-09-03 5 views
8

Xcode/objective c는 실제로 유용한 스택 추적을 인쇄하지 않습니다. 내 응용 프로그램이 어딘가에서 추락하고 45353453, 34524323, 6745345353, 457634524234와 같은 숫자 만 제공됩니다. 전혀 유용하지 않습니다.응용 프로그램의 현재 스택 추적을 인쇄하는 쉬운 방법은 무엇입니까?

그래서 NSLog()를 만들고 싶습니다. 내 모든 애플 리케이션에있는 모든 방법의 시작 부분에. 하지만 어쩌면 인간이 읽을 수있는 실제 스택 추적을 찾는 더 간단한 방법이 있을까요? 앱 실행이나 충돌뿐만 아니라 항상 발생하는 모든 활동에 대해서도 그렇습니다. 디버깅에 많은 도움이 될 것입니다.

+0

디버거에서 스택 추적을 따를 수 있습니다, 그것은 내가 – Daniel

+0

생각 충돌 전에 마지막 메소드 호출로 이동한다 아니, 디버거 정보가 도움이되지 않습니다. –

+1

왜 디버거 정보가 도움이되지 않습니까? 디버거에서 응용 프로그램을 시작하고 충돌이 발생하면 디버거가 다시 호출하여 각 호출 된 줄을 볼 수있는 멋진 스택 추적을 제공해야합니다. 예외가 발생하여 응용 프로그램이 중단되면 디버깅 방법에 대한 대답은 alex_c의 대답을 참조하십시오. –

답변

1

실제로 앱 내에서이를 안정적으로 수행 할 방법이 없습니다. 앱이 충돌하고 기호를 제공하지 않으면 디버그 버전이 아닌 제거 된 버전을 실행하는 것처럼 들립니다. 당신이 주변에 앉아 strip되지 않은 버전이있는 경우

, 당신이 그 숫자와 atos 명령을 사용하여 스택 프레임의 실제 이름 사이에 상관 관계 수 (터미널 man atos를 참조하거나 엑스 코드의 문서 또는 Google에 atos 검색).

아마 모든 메소드 호출의 스택을 기록하고 싶지는 않을 것입니다. 정보량이 급속하게 증가 할 것입니다. 그리고 앱에서 대부분의 메소드가 호출되는 이유에 대해서는 신비가 있어서는 안됩니다 (UIKit과 앱 간의 인터페이스가 왜 그런지 이해하는 데는 시간이 걸릴 것입니다).

4

뭔가 당신에게뿐만 아니라 도움이 될 수


@implementation UIApplication (MyCategory) 

+ (void)logStackTrace { 
    @try { 
     [[NSException exceptionWithName:@"Stack Trace" reason:@"Testing" userInfo:nil] raise]; 
    } 
    @catch (NSException *e) { 
     NSLog(@"%@", [e callStackSymbols]); 
    } 
} 

@end 
+8

이것은 iOS 4 이전에 유용합니다. iOS 4 이상에서는 [NSThread callStackSymbols]를 사용하십시오. –

관련 문제