Xcode 4.2 디버그가 스택 호출을 나타내지 않음
iOS 5 시뮬레이터/기기에서 Xcode 4.2 디버깅에 문제가 있습니다.예상대로 다음 코드가 충돌합니다.
NSArray *arr=[NSArray array];
[arr objectAtIndex:100];
iOS 4에서 나는 16진수의 유용한 스택 추적을 얻습니다.하지만 iOS 5에서는 다음과 같은 이점이 있습니다.
*** First throw call stack:
(0x16b4052 0x1845d0a 0x16a0674 0x294c 0x6f89d6 0x6f98a6 0x708743 0x7091f8 0x7fcaa9 0x2257fa9 0x16881c5 0x15ed022 0x15eb90a 0x15eadb4 0x15eaccb 0x6f02a7 0x6faa93 0x2889 0x2805)
감사해요.
제가 시도한 어떤 것도 이 문제를 해결하지 못했습니다(컴파일러, 디버거 등 모두 시도).iOS 5 업데이트를 위해 XCode를 업그레이드한 후 스택 추적이 작동하지 않는 것으로 보입니다.
그러나 다른 이유로도 유용한 나만의 예외 처리기를 만드는 효과적인 해결 방법을 찾았습니다.먼저 오류를 처리하는 기능을 만들어 콘솔에 출력합니다.
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"CRASH: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
}
그런 다음 앱 대리자에 예외 처리기를 추가합니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
// Normal launch stuff
}
바로 그거야!
이 방법이 작동하지 않는 경우 두 가지 이유만 있을 수 있습니다.
- 무언가가 당신을 덮어쓰고 있습니다.
NSSetUncaughtExceptionHandler
호출(전체 앱에 대해 하나의 핸들러만 있을 수 있음).예를 들어 일부 타사 라이브러리는 자체적으로 탐지되지 않은 예외 처리기를 설정합니다.마지막에 설정해 보십시오.didFinishLaunchingWithOptions
기능(또는 타사 라이브러리를 선택적으로 비활성화함).아니면 상징적인 중단점을 설정하는 것이 더 낫습니다.NSSetUncaughtExceptionHandler
누가 부르는지 빨리 확인할 수 있습니다.다른 항목을 추가하는 대신 현재 항목을 수정할 수 있습니다. - 예외 실예는예발않습니다지하생가외로제예)가 발생하지 .
EXC_BAD_ACCESS
예외는 아닙니다. 아래의 @Erik B의 코멘트에 대한 크레딧)
예외 중단점을 추가할 수 있는 유용한 옵션이 있습니다(중단점 탐색기 하단의 + 사용).이는 예외(또는 조건을 설정할 수 있음)에서 중단됩니다.이 선택이 4.2에서 새로운 것인지 아니면 누락된 기호 문제를 해결하려고 시도하는 것을 겨우 알아차린 것인지 모르겠습니다.
이 중단점에 도달하면 디버그 네비게이터를 사용하여 평소처럼 통화 스택을 탐색하고 변수를 검사할 수 있습니다.
복사/붙여넣기 등에 적합한 기호화된 콜 스택을 원한다면 gdb 역추적은 여기서 잘 작동합니다.
(gdb) bt
#0 0x01f84cf0 in objc_exception_throw ()
#1 0x019efced in -[NSObject doesNotRecognizeSelector:] ()
(등)
디버거에 새 기능이 있습니다.예외가 발생할 때마다 중단점을 설정하고 4.0에서 발생했던 것처럼 바로 실행을 중지할 수 있습니다.
중단점 네비게이터에서 "예외 중단점"을 추가하고 옵션 팝업에서 "완료"를 누릅니다.
그게 다야!
PS: 경우에 따라 Objective-C 예외에 대해서만 중단하는 것이 좋습니다.
이전처럼 우아하지 않은 솔루션이 하나 더 있지만 예외 중단점이나 처리기를 추가하지 않은 경우 한 가지 방법으로만 해결할 수 있습니다.
앱이 다운되고 첫 번째 스로우 콜 스택(16진수)이 생성되면 Xcode 콘솔에 입력합니다.info line *hex
(별을 잊지 마 그리고0x
16진수 지정자), 예:
(gdb) info line *0x2658
Line 15 of "path/to/file/main.m" starts at address 0x25f2 <main+50>
and ends at 0x267e <main+190>.
lldb를 사용하는 경우 입력할 수 있습니다.image lookup -a hex
(이 상황에서 별이 없는 경우) 유사한 출력을 얻을 수 있습니다.
이 방법을 사용하면 스로우 스택의 맨 위(약 5-7개의 시스템 예외 전파기가 있음)에서 충돌을 일으킨 함수로 이동하여 정확한 파일 및 코드 줄을 결정할 수 있습니다.
또한 비슷한 효과를 위해 터미널에서 tos 유틸리티를 사용할 수 있습니다.
atos -o path/to/AplicationBundle.app/Executable 0xAdress1 0xAdress2 0xAdress3 ...
그러면 기호화된 스택 추적을 얻을 수 있습니다(최소한 디버그 기호가 있는 함수의 경우).각 주소 호출에 대해 이 방법이 없기 때문에 이 방법이 더 좋습니다.info line
콘솔 출력에서 주소를 복사하여 터미널에 붙여넣기만 하면 됩니다.
예외 중단점을 추가하고(Breakpoint Navigator 하단의 +를 사용) 작업을 추가할 수 있습니다. bt
(Add Action 버튼을 클릭하고 Debugger Command를 선택한 다음 텍스트 필드에 "bt"를 입력합니다.)예외가 발생하면 즉시 스택 추적이 표시됩니다.
이것은 4.2에서 스택 추적을 가져오지 않는 일반적인 문제입니다.LLDB와 GDB 간에 스와핑을 시도하여 더 나은 결과를 얻을 수 있는지 확인할 수 있습니다.
여기에 버그 보고서를 제출합니다.
http://developer.apple.com/bugreporter/
편집:
LLVM GCC 4.2로 다시 전환하면 이러한 현상이 발생하지 않을 것으로 생각합니다.그러나 필요한 기능이 손실될 수 있습니다.
이 코드는 주 기능에 사용합니다.
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal;
@try {
retVal = UIApplicationMain(argc, argv, nil, nil);
}
@catch (NSException *exception) {
NSLog(@"CRASH: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
}
@finally {
[pool release];
}
return retVal;
}
Xcode의 디버그 콘솔 프롬프트에서 다음을 입력합니다.
image lookup -a 0x1234
그리고 다음과 같은 것을 보여줍니다.
Address: MyApp[0x00018eb0] (MyApp.__TEXT.__text + 91088)
Summary: MyApp`-[MyViewController viewDidAppear:] + 192 at MyViewController.m:202
Compile for Thumb(컴파일 for Thumb)를 다시 켜는 것(디버그 구성)이 제게는 효과가 있었습니다.
언급URL : https://stackoverflow.com/questions/7841610/xcode-4-2-debug-doesnt-symbolicate-stack-call
'programing' 카테고리의 다른 글
IP 주소를 가진 클라이언트는 서버 Azure SQL 데이터베이스에 액세스할 수 없습니다. (0) | 2023.05.20 |
---|---|
cmd.exe에 대한 sed와 같은 유틸리티가 있습니까? (0) | 2023.05.20 |
열 값을 기준으로 연관 배열 정렬 (0) | 2023.05.20 |
"APR 기반 Apache Tomcat Native 라이브러리를 찾을 수 없음"은 무엇을 의미합니까? (0) | 2023.05.15 |
중첩된 폴더에 대해 npm 설치를 실행하는 가장 좋은 방법은 무엇입니까? (0) | 2023.05.15 |