본문 바로가기
프로그래밍/Xcode-iOS

objective-C 디버깅 팁, po와 print

by Mr-후 2017. 11. 1.
반응형

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) 



반응형