2012-10-08 3 views
2

Xcode 4.5에서 X86_64 프로그램을 사용하고 있습니다. _NSWarnForDrawingImageWithNoCurrentContext를 중단하고 문맥이없는 그리기 호출을 중단하라는 경고가 나타납니다. 콜은 깊은 CALayer/NSView 호출 세트에서 발생합니다. 이것과 관련된 견해를 알고 싶습니다.lldb의 프레임 스택에 대한 시스템 호출 인수 검사

#0 0x00007fff9033f823 in _NSWarnForDrawingImageWithNoCurrentContext() 
#1 0x00007fff8ffd2cf3 in -[NSImageRep drawInRect:fromRect:operation:fraction:respectFlipped:hints:]() 
#2 0x00007fff901444ea in -[NSImageRep _newCGImageForProposedRect:context:hints:flipped:]() 
#3 0x00007fff8ffd3acb in -[NSImageRep CGImageForProposedRect:context:hints:]() 
#4 0x00007fff9006be1d in -[NSImageRep CGImageForProposedRect:context:hints:flipped:]() 
#5 0x00007fff900f0346 in -[NSImage _newSnapshotRepForRep:rect:context:processedHints:]() 
#6 0x00007fff900923c8 in -[NSImage _snapshotRepForRep:rect:context:processedHints:]() 
#7 0x00007fff9006bd77 in __48-[NSImage CGImageForProposedRect:context:hints:]_block_invoke_0() 
#8 0x00007fff8ffd14d6 in -[NSImage _usingBestRepresentationForRect:context:hints:body:]() 
#9 0x00007fff9006b9e5 in -[NSImage CGImageForProposedRect:context:hints:]() 
#10 0x00007fff8ff14754 in -[_NSImageLayerContents CA_copyRenderValue]() 
#11 0x00007fff890350c3 in -[CALayer(CALayerPrivate) _copyRenderLayer:layerFlags:commitFlags:]() 
#12 0x00007fff89034a7c in CA::Context::commit_layer(CA::Layer*, unsigned int, unsigned int, void*)() 
#13 0x00007fff890349a4 in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#14 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#15 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#16 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#17 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#18 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#19 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#20 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#21 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#22 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#23 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#24 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#25 0x00007fff8903492f in CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*)() 
#26 0x00007fff890258d6 in CA::Context::commit_transaction(CA::Transaction*)() 
#27 0x00007fff89025423 in CA::Transaction::commit()() 
#28 0x00007fff9010f032 in -[NSView(NSLayerKitGlue) _drawRectAsLayerTree:]() 
#29 0x00007fff8ffbe35a in -[NSView _drawRect:clip:]() 
#30 0x00007fff8ffbb093 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]() 
#31 0x00007fff8ffbbb24 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]() 
#32 0x00007fff8ffba223 in -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]() 
#33 0x00007fff8ffb5e4d in -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:]() 
#34 0x00007fff8ff7fd73 in -[NSView displayIfNeeded]() 
#35 0x00007fff8ff7f2ac in _handleWindowNeedsDisplayOrLayoutOrUpdateConstraints() 
#36 0x00007fff9054a971 in __83-[NSWindow _postWindowNeedsDisplayOrLayoutOrUpdateConstraintsUnlessPostingDisabled]_block_invoke_01208() 

_drawRect : clip :이 (가) 호출 된 뷰를 어떻게 확인할 수 있습니까?

나는 29 프레임으로 전환 한 후 p/x $arg1을하고 있지만 오류를

error: Couldn't materialize struct: Couldn't read rdi (materialize)

난 단지 찾는거야 소스 코드를 제공하고이 오류에 관한 로그를 커밋하고 알아낼 수 없습니다 시도했다 그 뜻은. 어떤 도움을 주시면 대단히 감사하겠습니다. 이는 또한 경고 메시지를 보내는 지원 중단 된 전화를 사용하는 Apple 코드에 대한 메시지를 피하기 위해 도움이 될 수 있습니다.

답변

3

"reg read arg1"과 같은 "register read"명령을 사용해 볼 수도 있지만, 여기 실제 문제는 rdi가 SysV x86_64 ABI가있는 휘발성 레지스터라는 것입니다. 즉, 함수 호출을 할 때마다 rdi의 내용이 어디에도 저장되지 않고 덮어 쓸 수 있습니다. 프레임 29가 프레임 28을 호출하자마자 디버거는 rdi가 덮어 씌워 졌다고 가정하고 (프레임 29는 프레임 28에 arg로 저장 될 것입니다) 프레임 29가 있던 rdi의 이전 내용을 검색 할 수 없습니다 기입.

"비 휘발성"또는 "피 호출자 보존"이라고하는 레지스터는 스택의 중간에서도 검색 할 수 있습니다. x86_64에는 rbx 및 r12-r15가 포함됩니다. 프레임 29가 변수를 보유하기 위해 r12를 사용하고 있고, 호출 프레임 28과 프레임 28이 r12를 사용하기를 원한다면 이전 값을 스택에 저장 한 다음 프레임 29로 돌아 오기 전에 그 값을 복원해야합니다. 이 저장 위치를 ​​찾고 프레임 29에 r12의 내용을 표시 할 수 있습니다 - 프레임 28이 저장 한 위치를보고 값을 검색하면됩니다.

여기서는 (1) 프레임 29에 중단 점을 넣고 그 지점에서 arg1 값을 인쇄하거나 (2) 프레임 29에 대한 어셈블리 지침을보고 기능이 첫 번째 항목을 저장했는지 확인하십시오 인수는 어딘가에 (비 휘발성 레지스터의 스택 상에) 당신이 여전히 조사 할 수있는 것입니다. 그렇지 않으면 스택 프레임이 28 개 더 깊어 질수록 인수 레지스터의 내용은 오래 전에 사라집니다.