objective-C 디버깅 팁, po와 print 그리고 b
개발하다 보면 Objective-C의 인스턴스에 들어 있는 값이나 배열의 값, 또는 수 등을 알고 싶은데 NSLog를 통해 출력을 해야하거나 브레이크포인트를 잡고 커서를 올려서 안에 들어있는 객체 속성을 팝업 메뉴로 보거나 해야하는 번거로움이 있지만 GDB에 직접 명령어를 전달해서 그 내용을 볼 수 있는 방법에 대한 소개이다.
Xcode의 '콘솔' 윈도를 사용해서 GDB에 직접 명령을 전달할 수 있은데 그러기 위해서는 브레이크 포인트 또는 일시정지 버튼을 눌러 프로그램을 일단 정지 시켜 디버깅 영역이 잡히게 되면 Output 윈도우에서 몇몇 명령어를 사용할 수 있다.
Objective-C의 인스턴스 문자열 출력을 출력하기 위해서 'po' 명령을 사용한다. 이 때 출력되는 문자열은 'description' 메서드의 반환값이다.
NSArray의 경우 po 명령어를 통해 출력하게 되면 인스턴스 전체의 'description'이 반환값이 되므로 배열의 내용을 알고 싶을 때 사용하면 유용하게 쓸 수 있다.
Objective-C의 인스턴스가 아닌 변수의 값을 출력하고자할 때는 'print' 명령을 사용하면된다.
int, long 등 변수의 내용을 출력할 때 'po'을 사용해도 되지만 'print' 명령을 사용할 경우 좀더 자세한 내용을 확인 할 수 있다.
'b' 명령어의 경우 특정 함수나 메서드에서 일시 정지를 할 수 있도록 설정할 수 있다.
b NSLog 처럼 사용하면 된다.
그외 데이터나 로그를 파일로 기록하는 방법은 GDB 콘솔상에서 다음과 같이 입력하면 된다.
print (int)[dic writeToFile:@"/data.plist" atomically:YES];
라고 하면 프로퍼티 리스트 파일로 작성이 된다. 디버깅할 때 유용하게 사용할 수 있다.
다음은 Xcode에서 각 명령어를 실행해본 결과 로그 내용이다.
(lldb) po scanner;
<NSConcreteScanner: 0x1c02756c0>
(lldb) po result;
987654321
(lldb) print result;
(unsigned long long) $2 = 987654321
(lldb) b
Current breakpoints:
1: file = '/Users/younghumin/Documents//workspace/ButtonMobile/ButtonMobile//ZHBLEPeripheral.m', line = 124, exact_match = 0, locations = 1, resolved = 1, hit count = 0
1.1: where = ButtonMobile`-[ discoverCharacteristics:forService:onFinish:] + 108 at .m:126, address = 0x000000010259a608, resolved, hit count = 0
2: file = '/Users/younghumin/Documents//workspace/ButtonMobile/ButtonMobile//.m', line = 133, exact_match = 0, locations = 1, resolved = 1, hit count = 0
2.1: where = ButtonMobile`-[ discoverDescriptorsForCharacteristic:onFinish:] + 76 at .m:135, address = 0x000000010259a8ac, resolved, hit count = 0
3: file = '/Users/younghumin/Documents//workspace/ButtonMobile/ButtonMobile/Controller/SelfDrawMoney/SelfDrawMoneyViewController.m', line = 440, exact_match = 0, locations = 1, resolved = 1, hit count = 0
3.1: where = ButtonMobile`-[SelfDrawMoneyViewController sendRequestToServerParam:] + 52 at SelfDrawMoneyViewController.m:440, address = 0x0000000102545d48, resolved, hit count = 0
4: file = '/Users/younghumin/Documents//workspace/ButtonMobile/ButtonMobile///.m', line = 30, exact_match = 0, locations = 1, resolved = 1, hit count = 0
4.1: where = ButtonMobile`-[ handleTapGesture:] + 52 at .m:31, address = 0x0000000102541c58, resolved, hit count = 0
5: file = '/Users/younghumin/Documents//workspace/ButtonMobile/ButtonMobile//.m', line = 41, exact_match = 0, locations = 1, resolved = 1, hit count = 0
5.1: where = ButtonMobile`-[ initWithQueue:] + 68 at .m:43, address = 0x00000001025746ec, resolved, hit count = 0
6: file = '/Users/younghumin/Documents//workspace/ButtonMobile/ButtonMobile/Controller/iBeacon/IBeaconViewController.m', line = 32, exact_match = 0, locations = 1, resolved = 1, hit count = 1
6.1: where = ButtonMobile`-[IBeaconViewController viewDidLoad] + 360 at IBeaconViewController.m:32, address = 0x000000010252e378, resolved, hit count = 1
(lldb) b NSLog;
Breakpoint 7: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) b raise;
Breakpoint 8: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb)
'프로그래밍 > Xcode-iOS' 카테고리의 다른 글
Objective-C 카테고리 정의 (0) | 2017.11.01 |
---|---|
Objective-C 프로토콜 정의 (0) | 2017.11.01 |
ios convert hex string to decimal (0) | 2017.10.31 |
iOS statusBar Color변경에 따른 UINavigationBar 높이 조절 팁 (0) | 2017.09.29 |
iOS 화면 밝기 조정 방법 (0) | 2017.09.27 |