본문 바로가기

iPhone developer

Xcode Debugging

실제 코딩 시 다음과 같이 코드를 작성할 일은 없겠지만, NSMutableDictionary에 데이터를 저장하는 코드에서 nil 값이 입력되어 앱이 죽는 경우를 종종 볼 수 있다.


NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity10];

[dict setObject:nil forKey:@"test"];


이런 경우, Xcode는 다음과 같은 상태로 멈춰진다. 실제 문제를 일으킨 부분은 위와 같은 코드인데 Xcode는 다음 코드에서 멈춰 있다.



return UIApplicationMain(argc, argv, nilNSStringFromClass([LPAppDelegate class]));


물론 콘솔에 찍힌 다음과 같은 메시지를 보면 문제가 발생한 이유는 쉽게 알 수 있겠지만, 실제 상황에서는 해당 부분을 정확히 찾고자 한다면 약간의 노력이 필요할 것이다.


2012-08-21 21:20:56.574 Debuging[3198:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: test)'

*** First throw call stack:

(0x1790022 0x1190cd6 0x1738a48 0x17389b9 0x178f2da 0x2538 0x12386 0x13274 0x22183 0x22c38 0x16634 0x167aef5 0x1764195 0x16c8ff2 0x16c78da 0x16c6d84 0x16c6c9b 0x12c65 0x14626 0x245d 0x23c5)

terminate called throwing an exception(lldb)


이 문제를 좀더 쉽게 찾기 위해서 다음과 같은 추가 작업을 하면 된다.

우선 브레이크포인트 네비게이터에서 하단의 "+" 버튼을 클릭하여 [Add Symbolic Breakpoint...]를 선택한 후 다음 그림과 같이 "objc_exception_throw"를 추가한다. 그리고 "Done" 버튼을 클릭하자.



그리고 추가된 "objc_exception_throw"에 마우스 오른쪽 버튼을 클릭하여 [Move Breakpoint To]의 하위 메뉴 중 [User]를 선택한다(이렇게 추가하면 모든 프로젝트에서 사용할 수 있다.). 이제 다시 프로젝트를 실행해 보자. 이제 원하는 곳을 쉽게 찾을 수 있을 것이다.