아이 폰 개발 기법 의 디 버 깅 편 - 프로그램 Crash 후의 디 버 깅 기법
0
링크 : http://www.yifeiyang.net/iphone-development-skills-of-debugging-articles-3-crash-after-debugging-skills-program/
전 재 는 위의 문 자 를 보존 하 십시오.
시 뮬 레이 터 에 스 택 정보 표시
아이 폰 에 로그 출력
아이 폰 애플 리 케 이 션 의 CrashReporter 기능
CrashLog 의 위치
. dsYM 파일
기호 문 제 를 해결 하 다
StackTrace 로 충돌 로그 가 져 오기
이상 처리 메커니즘
처리 신호
총결산
아이 폰 개발 기법 의 디 버 깅 편 (3) - 프로그램 Crash 후의 디 버 깅 기법 은 우리 의 프로그램 이 갑자기 죽 었 을 때 Xcode 는 갑자기 "message sent to deal located intance" 의 오 류 를 보 냈 습 니 다. 우 리 는 프로그램 bug 를 어떻게 찾 아야 합 니까?아니면 저희 가 이미 AdHoc 를 통 해 발 표 했 거나.β버 전 프로그램, 심지어 우리 프로그램 이 app store 에 발표 되 었 습 니 다.프로그램 이 갑자기 테스트 인원 이나 최종 사용자 에 게 서 갑자기 떨 어 졌 을 때 이러한 로그 정 보 를 수집 하여 bug 를 분석 할 수 있 습 니까?
아래 의 글 에서 나 는 점차 이 기교 들 을 깊이 설명 할 것 이다.
시 뮬 레이 터 에 스 택 정 보 를 표시 합 니 다. 시 뮬 레이 터 에서 디 버 깅 할 때 아래 메모리 접근 오류 가 자주 발생 할 수 있 습 니 다.
1 2011-01-17 20:21:11.41 App[26067:207] *** -[Testedit retain]: message sent to deallocated instance 0x12e4b0 우선, 우 리 는 문 제 를 찾기 위해 서 는 스 택 정 보 를 표시 해 주 는 Xcode 가 필요 합 니 다. Scode 에서 파일 의 속성 을 실행 하여 설정 할 수 있 습 니 다.다음 그림 에서 보 듯 이 MallocStackLogging 옵션 을 선택 하 십시오.이 옵션 은 시 뮬 레이 터 에서 만 유효 하 며 iOS 버 전 을 바 꾼 후에 도 다시 설정 해 야 합 니 다.
그 후에 터미널 에 info malloc - history 명령 을 입력 할 수 있 습 니 다. 다음 과 같 습 니 다.
1 (gdb) info malloc-history 0x12e4b0 그 후에 다음 과 같은 스 택 정 보 를 얻 고 구체 적 인 문제점 을 분석한다.
이외에 도 아래 명령 을 사용 할 수 있다.
1 (gdb) shell malloc_history {pid/partial-process-name} {address} 예 를 들 어 다음 그림 에서 보 듯 이
또한 메모리 사용 시 'EXC BAD ACCESS' 의 오류 메시지 도 자주 발생 합 니 다. 이 때 저 희 는 위 에서 실행 중인 파일 속성 중의 NSZombieEnabled 를 선택 하면 이 문 제 를 찾 을 수 있 습 니 다.마지막 으로 이 설정 정 보 는 모두 운행 기간 에 확인 할 수 있 습 니 다. 다음 과 같 습 니 다.
1 NSLog(@"NSZombieEnabled: %s", getenv("NSZombieEnabled")); 아이 폰 에 로 그 를 출력 합 니 다. 시 뮬 레이 터 가 아니 거나 우리 장치 가 PC 에 연결 되 지 않 았 다 면 프로그램 을 어떻게 디 버 깅 합 니까?만약 에 저희 가 AdHoc 를 통 해 프로그램 을 발표 하면 테스트 인원 의 피드백 을 수시로 받 고 싶 습 니 다. 아래 의 방법 을 이용 하여 표준 출력 (stderr) 정 보 를 파일 에 기록 한 다음 에 메 일 신식 으로 개발 자 에 게 보 낼 수 있 습 니 다.1. 로그 파일 내용 을 비우 고 출력 위 치 를 전환 할 스위치 를 설정 합 니 다.
1
2
3
4
5
6
7
8 - (BOOL)deleteLogFile {
[self finishLog];
BOOL success = [[NSFileManager defaultManager] removeItemAtPath:[self loggingPath] error:nil];
[self startLog];
return success;
} 위의 deleteLogFile 을 호출 하면 이전 로 그 를 비우 고 새로운 출력 을 설정 합 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 - (void)finishLog {
fflush(stderr);
dup2(dup(STDERR_FILENO), STDERR_FILENO);
close(dup(STDERR_FILENO));
}
- (NSString*)loggingPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
return logPath;
}
- (void)startLog {
freopen([[self loggingPath] cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
} 2. 로그 가 져 오 면 개발 자 에 게 아래 의 방식 으로 메 일 을 보 낼 수 있 습 니 다.
1
2
3
4
5
6
7
8
9
10
11 - (void)sendLogByMail {
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker setSubject:[NSString stringWithFormat:@"%@ - Log", [self appName]]];
NSString *message = [NSString stringWithContentsOfFile:[self loggingPath] encoding:NSUTF8StringEncoding error:nil];
[picker setMessageBody:message isHTML:NO];
[self.navigationController presentModalViewController:picker animated:YES];
[picker release];
} 아이 폰 애플 리 케 이 션 의 CrashReporter 기능 애플 은 펌웨어 2.0 을 발표 할 때 아이 폰 개발 자 에 게 메 일 로 오류 보고 서 를 보 내 개발 자 들 이 자신의 소프트웨어 운행 상황 을 잘 알 수 있 도록 하 는 기능 이 있다.그러나 많은 개발 자 들 은 이 서비스 가 ~ / Library / Logs / CrashReporter / Mobile Device directory 의 오류 정 보 를 가 져 올 수 없다 고 보고 합 니 다.현재 애플 은 아이 폰 개발 자 들 이 아 이 튠 즈 를 통 해 붕괴 보고 서 를 쉽게 볼 수 있 도록 더 간단 한 방법 을 제공 하고 있다.구체 적 인 방법 은 아 이 튠 즈 커 넥 트 (들 어가 기 전에 아이 폰 개발 자 계 정 이 있 는 지 확인) 에 들 어가 프로그램 관 리 를 클릭 하면 사용자 충돌 로 그 를 볼 수 있 습 니 다.장치 에서 CrashLog 를 꺼 내 분석 하 는 방법 을 소개 합 니 다.CrashLog 의 위치 프로그램 Crash 이후 장 치 를 PC 의 iTunes 와 연결 하고 장치 의 CrashLog 파일 도 PC 에 동기 화 합 니 다.그 중 위 치 는 다음 과 같다.
1
2
3
4
5
6
7
8 Mac:
~/Library/Logs/CrashReporter/MobileDevice
Windows Vista/7:
C:\Users\<user_name>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice
Windows XP:
C:\Documents and Settings\<user_name>\Application Data\Apple computer\Logs\CrashReporter 이 디 렉 터 리 아래 에 구체 적 인 장치 의 디 렉 터 리 가 있 을 것 입 니 다. 그 아래 에는 많은 *. crash 파일 이 있 습 니 다.예 를 들 어 프로그램 TestEditor 가 iPhone 1 장치 에 있 는 crash Log 는 다음 과 같 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 ~Library/Logs/CrashReporter/MobileDevice/iPhone1/TestEditor_2010-09-23-454678_iPhone1.crash
Incident Identifier: CAF9ED40-2D59-45EA-96B0-52BDA1115E9F
CrashReporter Key: 30af939d26f6ecc5f0d08653b2aaf47933ad8b8e
Process: TestEditor [12506]
Path: /var/mobile/Applications/60ACEDBC-600E-42AF-9252-42E32188A044/TestEditor.app/TestEditor
Identifier: TestEditor
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2010-09-23 11:25:56.357 +0900
OS Version: iPhone OS 3.1.3 (7E18)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000059
Crashed Thread: 0
Thread 0 Crashed:
0 UIKit 0x332b98d8 0x331b2000 + 1079512
1 UIKit 0x3321d1a8 0x331b2000 + 438696
2 UIKit 0x3321d028 0x331b2000 + 438312
3 UIKit 0x332b9628 0x331b2000 + 1078824
4 UIKit 0x33209d70 0x331b2000 + 359792
5 UIKit 0x33209c08 0x331b2000 + 359432
6 QuartzCore 0x324cc05c 0x324ae000 + 122972
7 QuartzCore 0x324cbe64 0x324ae000 + 122468
8 CoreFoundation 0x3244f4bc 0x323f8000 + 357564
9 CoreFoundation 0x3244ec18 0x323f8000 + 355352
10 GraphicsServices 0x342e91c0 0x342e5000 + 16832
11 UIKit 0x331b5c28 0x331b2000 + 15400
12 UIKit 0x331b4228 0x331b2000 + 8744
13 TestEditor 0x00002c3a 0x1000 + 7226
14 TestEditor 0x00002c04 0x1000 + 7172
... ( ) 문제 가 생 겼 을 때의 스 택 정 보 를 보 았 지만 기호 정보 가 없어 서 어디 가 문제 인지 모 르 겠 습 니 다...........................................................우선, 우 리 는 이 서 류 를 찾 을 것 이다.Xcode 로 컴 파일 된 프로그램 은 컴 파일 디 렉 터 리 에서 [프로그램 이름]. app. dsmy 파일 을 생 성 합 니 다. 예 를 들 어 Xcode 4 의 컴 파일 디 렉 터 리 가 부족 한 것 은?
1
2
3
4
5 ~Library/Developer/Xcode/DerivedData
# .dSMY
$ cd ~/Library/Developer/Xcode/DerivedData
$ find . -name '*.dSYM' 또한, 우 리 는 Xcode 의 Preferences... - > Locations - > Locations 의 Derived Data 를 통 해 이 디 렉 터 리 의 위 치 를 확인 할 수 있 습 니 다.
위의 예 중의 프로그램 에서 우 리 는 그 위 치 를 찾 았 다.
1 ~/Library/Developer/Xcode/DerivedData/TestEditor-aahmlrjpobenlsdvhjppcfqhogru/ArchiveIntermediates/TestEditor/BuildProductsPath/Release-iphoneos/TestEditor.app.dSYM ※ 여러분 은 App Store 에서 자신의 프로그램 을 발표 할 때마다 이 파일 을 저장 하 는 것 을 기억 하 세 요. 그렇지 않 으 면 Crash 가 나타 날 때 손 쓸 방법 이 없습니다.기호 문 제 를 해결 한 다음 에. dsYM 파일 을 사용 하여 프로그램 기 호 를 복원 하 는 방법 을 소개 합 니 다.우선, Xcode 가 제공 하 는 symbolicatecrash 라 는 작은 도 구 를 사용 하면 CrashLog 에 기호 정 보 를 추가 하 는 기능 을 실현 할 수 있 습 니 다.이 파일 은 아래 위치 에 있 습 니 다. 편 의 를 위해 시스템 기본 경로 로 복사 할 수 있 습 니 다.
1
2
3 /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash
$ sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash /usr/local/bin 다음 명령 을 사용 하면 터미널 에서 기호 정보 가 있 는 CrashLog 를 출력 할 수 있 습 니 다.
1
2
3 $ symbolicatecrash [CrashLog file] [dSYM file]
$ symbolicatecrash TestEditor_2010-09-23-454678_iPhone1.crash TestEditor.app.dSYM 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Thread 0 Crashed:
0 UIKit 0x332b98d8 -[UIWindowController transitionViewDidComplete:fromView:toView:] + 668
1 UIKit 0x3321d1a8 -[UITransitionView notifyDidCompleteTransition:] + 160
2 UIKit 0x3321d028 -[UITransitionView _didCompleteTransition:] + 704
3 UIKit 0x332b9628 -[UITransitionView _transitionDidStop:finished:] + 44
4 UIKit 0x33209d70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 284
5 UIKit 0x33209c08 -[UIViewAnimationState animationDidStop:finished:] + 60
6 QuartzCore 0x324cc05c _ZL23run_animation_callbacksdPv + 440
7 QuartzCore 0x324cbe64 _ZN2CAL14timer_callbackEP16__CFRunLoopTimerPv + 156
8 CoreFoundation 0x3244f4bc CFRunLoopRunSpecific + 2192
9 CoreFoundation 0x3244ec18 CFRunLoopRunInMode + 44
10 GraphicsServices 0x342e91c0 GSEventRunModal + 188
11 UIKit 0x331b5c28 -[UIApplication _run] + 552
12 UIKit 0x331b4228 UIApplicationMain + 960
13 TestEditor 0x00002c3a main (main.m:14)
14 TestEditor 0x00002c04 0x1000 + 7172 따라서 우 리 는 프로그램 에서 문제 가 생 긴 부분 을 구체 적 으로 찾 을 수 있다.StackTrace 로 충돌 시 로그 이상 처리 메커니즘 을 가 져 올 때 모든 언어 에 이상 처리 메커니즘 이 있 고 Objective - C 도 예외 가 아니다.C + + / 자바 와 유사 한 문법 으로 @ try, @ catch, @ throw, @ finally 키 워드 를 제공 합 니 다.사용 방법 은 다음 과 같다.
1
2
3
4
5
6
7
8
9
10
11
12 @try {
... }
@catch (CustomException *ce) {
... }
@catch (NSException *ne) {
// Perform processing necessary at this level.
... }
@catch (id ue) {
... }
@finally {
// Perform processing necessary whether an exception occurred or not.
... } 또한 시스템 Crash 로 인 한 프로그램 이상 종료 에 대해 서 는 UncaughtExceptionHandler 메커니즘 을 통 해 캡 처 할 수 있 습 니 다.프로그램 에서 catch 이외 의 내용 이 시스템 자체 의 오류 처리 에 의 해 포착 되 었 다 는 것 이다.우리 가 해 야 할 일 은 이 ExceptionHandler 를 사용자 정의 함수 로 대체 하면 된다.
여기 에는 주로 두 개의 함수 가 있다.
NSGetUncaughtExceptionHandler () 는 현재 시스템 자체 처리 Handler 를 가 져 옵 니 다.이 를 받 은 후 프로그램 이 정상적으로 종료 되면 시스템 의 원래 설정 을 복원 합 니 다.
NSSetUncaughtExceptionHandler () 빨간색 설정 사용자 정의 함수 간단 한 사용 예 는 다음 과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 void MyUncaughtExceptionHandler(NSException *exception)
{
printf("uncaught %s
", [[exception name] cString]);
// ~
//
NSArray *callStackArray = [exception callStackReturnAddresses];
int frameCount = [callStackArray count];
void *backtraceFrames[frameCount];
for (int i=0; i<frameCount; i++) {
backtraceFrames[i] = (void *)[[callStackArray objectAtIndex:i] unsignedIntegerValue];
}
}
int main()
{
// ~
NSUncaughtExceptionHandler *ueh = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&MyUncaughtExceptionHandler);
// ~
}
- (void)exit_processing:(NSNotification *)notification {
NSSetUncaughtExceptionHandler(ueh);
}
- (void)viewDidLoad {
// UIApplicationWillTerminateNotification
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(exit_processing:)
name:UIApplicationWillTerminateNotification
object:app]
} signal 을 처리 할 때 Objective - C 의 이상 처 리 를 사용 하면 signal 을 얻 을 수 없습니다. 이 를 처리 하려 면 유 닉 스 표준 signal 체 제 를 이용 하여 SIGABRT, SIGBUS, SIGSEGV 등 신호 발생 시의 처리 함 수 를 등록 해 야 합 니 다.이 함수 에서 우 리 는 스 택 정보, 버 전 정보 등 우리 가 원 하 는 모든 것 을 출력 할 수 있 습 니 다.
예 코드 는 다음 과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #include <signal.h>
void stacktrace(int sig, siginfo_t *info, void *context)
{
[mstr appendString:@"Stack:
"];
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i <; frames; ++i) {
[mstr appendFormat:@"%s
", strs[i]];
}
}
int main(int argc, char *argv[])
{
struct sigaction mySigAction;
mySigAction.sa_sigaction = stacktrace;
mySigAction.sa_flags = SA_SIGINFO;
sigemptyset(&mySigAction.sa_mask);
sigaction(SIGQUIT, &mySigAction, NULL);
sigaction(SIGILL , &mySigAction, NULL);
sigaction(SIGTRAP, &mySigAction, NULL);
sigaction(SIGABRT, &mySigAction, NULL);
sigaction(SIGEMT , &mySigAction, NULL);
sigaction(SIGFPE , &mySigAction, NULL);
sigaction(SIGBUS , &mySigAction, NULL);
sigaction(SIGSEGV, &mySigAction, NULL);
sigaction(SIGSYS , &mySigAction, NULL);
sigaction(SIGPIPE, &mySigAction, NULL);
sigaction(SIGALRM, &mySigAction, NULL);
sigaction(SIGXCPU, &mySigAction, NULL);
sigaction(SIGXFSZ, &mySigAction, NULL);
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return (retVal);
} 총결산
다시 말 하면 StackTrace 로 붕 괴 를 일 으 켰 을 때 로그 의 순 서 는 다음 과 같다.
NSGetUncaughtExceptionHandler () 로 현재 시스템 이상 처리 Handler 가 져 오기
NSSetUncaughtExceptionHandler () 로 사용자 정의 이상 처리 Handler 등록
등록 signal 처리 메커니즘
등록 Handler 에서 스 택, 버 전 번호 등 정 보 를 인쇄 합 니 다 필요 할 때 dump. txt 파일 에 저장 하기
이상 프로그램 종료 프로그램 이 이상 하 게 종료 되 지 않 으 면 이전 시스템 의 이상 처리 함수 핸들 을 복원 합 니 다.
다음 프로그램 이 시작 되면 dump. txt 의 이상 파일 이 발견 되 고 메 일 발송 보고 체 제 를 시작 합 니 다 전체 코드 프레임 워 크 는 다음 과 같 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 #include <signal.h>
void stacktrace(int sig, siginfo_t *info, void *context)
{
[mstr appendString:@"Stack:
"];
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i <; frames; ++i) {
[mstr appendFormat:@"%s
", strs[i]];
}
}
void MyUncaughtExceptionHandler(NSException *exception)
{
printf("uncaught %s
", [[exception name] cString]);
// ~
//
NSArray *callStackArray = [exception callStackReturnAddresses];
int frameCount = [callStackArray count];
void *backtraceFrames[frameCount];
for (int i=0; i<frameCount; i++) {
backtraceFrames[i] = (void *)[[callStackArray objectAtIndex:i] unsignedIntegerValue];
}
}
int main(int argc, char *argv[])
{
struct sigaction mySigAction;
mySigAction.sa_sigaction = stacktrace;
mySigAction.sa_flags = SA_SIGINFO;
sigemptyset(&mySigAction.sa_mask);
sigaction(SIGQUIT, &mySigAction, NULL);
sigaction(SIGILL , &mySigAction, NULL);
sigaction(SIGTRAP, &mySigAction, NULL);
sigaction(SIGABRT, &mySigAction, NULL);
sigaction(SIGEMT , &mySigAction, NULL);
sigaction(SIGFPE , &mySigAction, NULL);
sigaction(SIGBUS , &mySigAction, NULL);
sigaction(SIGSEGV, &mySigAction, NULL);
sigaction(SIGSYS , &mySigAction, NULL);
sigaction(SIGPIPE, &mySigAction, NULL);
sigaction(SIGALRM, &mySigAction, NULL);
sigaction(SIGXCPU, &mySigAction, NULL);
sigaction(SIGXFSZ, &mySigAction, NULL);
// ~
NSUncaughtExceptionHandler *ueh = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&MyUncaughtExceptionHandler);
// ~
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return (retVal);
}
- (void)exit_processing:(NSNotification *)notification {
NSSetUncaughtExceptionHandler(ueh);
}
- (void)viewDidLoad {
// UIApplicationWillTerminateNotification
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(exit_processing:)
name:UIApplicationWillTerminateNotification
object:app]
} 입력 한 CrashLog 는 다음 과 같 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Signal:10
Stack:
0 TestEditor 0x0006989d dump + 64
1 TestEditor 0x00069b4b signalHandler + 46
2 libSystem.B.dylib 0x31dcd60b _sigtramp + 26
3 TestEditor 0x000252b9 -[PopClientcreateUnreadMessageWithUIDL:maxMessageCount:] + 76
4 TestEditor 0x00025b85 -[PopClientgetUnreadIdList:] + 348
5 TestEditor 0x000454dd -[Connection receiveMessages:] + 688
6 TestEditor 0x00042db1 -[Connection main] + 188
7 Foundation 0x305023f9 __NSThread__main__ + 858
8 libSystem.B.dylib 0x31d6a5a8 _pthread_body + 28
AppVer:TestEditor 1.2.0
System:iPhone OS
OS Ver:3.0
Model:iPhoneDate:09/06/08 21:25:59JST 그 중에서sigtramp 함수 아래 에서 우리 프로그램 에 들 어가 기 시작 합 니 다. 즉, 주소 0x 000252 b9 부터 시작 합 니 다.그 에 대응 하 는 구체 적 인 파일 이름과 줄 번 호 를 우리 가 알 수 있 습 니까?앞서 소개 한 dSYM 파일 과 gdb 를 이용 하여 우 리 는 이 정 보 를 얻 을 수 있 습 니 다.
1
2
3
4
5
6
7 cd $PROJ_PATH$/build/Release-iphoneos/TestEditor.app.dSYM/
cd Contents/Resources/DWARF
gdb TestEditor
gdb>info line *0x000252b9
Line 333 of "~/IbisMail/Classes/Models/PopClient.m";
starts at address 0x2a386 <-[PopClient retrieve:]+86> and
ends at 0x2a390 <-[PopClient retrieve:]+96> 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception Class에서 에러 코드 해석 ~초기초편~직장에서 C# 프로젝트가 내뿜는 오류 코드를 구문 분석하고 오류의 위치를 확인하기 위해 Exception class를 활용할 수 있었습니다. 지금까지 Exception Class 에 대해서 별로 파악할 수 없었기 때...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.