아이 폰 개발 기법 의 디 버 깅 편 - 프로그램 Crash 후의 디 버 깅 기법

6 11 / 11
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>

좋은 웹페이지 즐겨찾기