2014-02-24 5 views
1

예외에 대한 내 스택 추적은 다음과 같습니다.개인 메서드에서 디버거 콘솔에서 self를 인쇄하는 방법

#0 0x049f088a in objc_exception_throw() 
#1 0x05f933b5 in __NSFastEnumerationMutationHandler() 
#2 0x03046e9d in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]() 
#3 0x03047043 in __85-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]_block_invoke() 
#4 0x03046f14 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]() 
#5 0x03047043 in __85-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]_block_invoke() 
#6 0x03046f14 in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]() 
#7 0x03046d3e in -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:]() 
#8 0x03052187 in -[UIView(Internal) _addSubview:positioned:relativeTo:]() 
#9 0x03045846 in -[UIView(Hierarchy) insertSubview:atIndex:]() 
#10 0x02fde714 in __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke() 
#11 0x0304c3ef in +[UIView(Animation) performWithoutAnimation:]() 
#12 0x02fddc96 in -[_UINavigationParallaxTransition animateTransition:]() 
#13 0x03118e4e in -[UINavigationController _startCustomTransition:]() 
#14 0x031250c7 in -[UINavigationController _startDeferredTransitionIfNeeded:]() 
#15 0x03125cb9 in -[UINavigationController __viewWillLayoutSubviews]() 
#16 0x0325f181 in -[UILayoutContainerView layoutSubviews]() 
#17 0x03055267 in -[UIView(CALayerDelegate) layoutSublayersOfLayer:]() 
#18 0x04a0281f in -[NSObject performSelector:withObject:]() 
#19 0x023b12ea in -[CALayer layoutSublayers]() 
#20 0x023a50d4 in CA::Layer::layout_if_needed(CA::Transaction*)() 
#21 0x023a4f40 in CA::Layer::layout_and_display_if_needed(CA::Transaction*)() 
#22 0x0230cae6 in CA::Context::commit_transaction(CA::Transaction*)() 
#23 0x0230de71 in CA::Transaction::commit()() 
#24 0x0230e544 in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)() 
#25 0x05ecb4ce in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() 
#26 0x05ecb41f in __CFRunLoopDoObservers() 
#27 0x05ea9344 in __CFRunLoopRun() 
#28 0x05ea8ac3 in CFRunLoopRunSpecific() 
#29 0x05ea88db in CFRunLoopRunInMode() 
#30 0x058939e2 in GSEventRunModal() 
#31 0x05893809 in GSEventRun() 
#32 0x02fead3b in UIApplicationMain() 
#33 0x000035f8 in main at /Users/dmueller39/Projects/ios-bloomberg/Bloomberg/main.mm:18 

이것을 캡처하면 디버거가 일시 중지되었습니다. 프레임 # 2에 self 값을 인쇄하려면 어떻게해야합니까? 당신을 위해

답변

3

소스 코드가없는 스택 프레임에 po self을 입력하여 간단히 인쇄 할 수 없습니다.

올바른 것을 인쇄하면됩니다.

여기에서 자세한 내용을 참조하십시오 : http://www.clarkcox.com/blog/2009/02/04/inspecting-obj-c-parameters-in-gdb/

당신이 디버깅 올바른 아키텍처를 선택해야합니다 (즉 바이너리 32 비트, 64 비트, 팔, 시뮬레이터 등의 경우).

+0

그 대답은 제가 원한 것입니다. 내가 너무 대담 할 수 있다면, 내가 읽은 기술 블로그가 무엇인지 물어볼 수 있을까? – Saltymule

+3

lldb에서 이것은 인수 레지스터'p/x $ arg1' 등 (armv7, x86_64, arm64에서 args가 reg에 전달되는)에 대해 의사 레지스터 이름을 표시함으로써 조금 단순화됩니다. 그러나 백 트레이스의 중간에있는 스택 프레임의 경우, 함수를 분해하고 인수가 저장된 위치를 확인해야합니다 (다른 곳으로 저장 한 경우) ... 다른 함수가 호출 되 자마자 인수가 전달됩니다 레지스터는 다른 값에 대해 재사용됩니다. lldb는 그들이 갇혀 있다는 것을 알고 있기 때문에 스택 중간에 당신을 보여주지 않습니다. 당신은 실제로 func의 시작에 있어야합니다. –

0

겠습니까

(lldb) frame select 2 

(lldb) po self 

사용할 수 있습니까?

+0

그런 식으로 작동하지 않습니다. 죄송합니다. 소스 코드가 없으면 레지스터에서 변수를 찾아야합니다. –

+1

당신 말이 맞아요. 그는 그 프레임들에 대한 디버그 정보가 없다는 것을 깨닫지 못했습니다. 그래서 더 신중하게 질문을해야합니다. –

관련 문제