2

Xcode4.5でX86_64プログラムを使用しています。_NSWarnForDrawingImageWithNoCurrentContextで中断し、コンテキストなしで描画呼び出しを停止するという警告が表示されます。呼び出しは、CALayer/NSView呼び出しの深いセットで発生しています。これがどのような見方をしているのか知りたい。

#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が、エラーが発生します

エラー:構造体をマテリアライズできませんでした:rdiを読み取れませんでした(マテリアライズ)

このエラーに関連するソースコードとコミットログを見つけているだけで、それが何を意味するのか理解できません。これは、警告を表示する非推奨の呼び出しを使用しているAppleコードに関するメッセージを回避するのにも役立つため、どんな助けでも大歓迎です。

4

1 に答える 1

3

「regreadarg1」のように「registerread」コマンドを使用してみることができますが、ここでの本当の問題は、rdiがSysVx86_64ABIの揮発性レジスタであるということです。つまり、関数呼び出しを行うたびに、rdiの内容がどこにも保存されずに上書きされている可能性があります。フレーム29がフレーム28と呼ばれるとすぐに、デバッガーはrdiが上書きされたと想定し(フレーム29はおそらくフレーム28への引数としてそこに何かを格納します)、フレーム29が持っていたrdiの以前のコンテンツを取得できなくなりますエントリ。

「不揮発性」または「呼び出し先保存」と呼ばれるレジスタは、スタックの途中でも取得可能であることが保証されています。x86_64では、これらにはrbxとr12-r15が含まれます。フレーム29がr12を使用して変数を保持し、フレーム28を呼び出し、フレーム28がr12を使用する場合、古い値をスタックに保存してから、フレーム29に戻る前にその値を復元する必要があります。デバッガーは次の方法を知っています。この保存場所を見つけて、フレーム28が保存した場所を確認し、値を取得することで、フレーム29のr12の内容を表示できます。

ここでの唯一の希望は、(1)フレーム29にブレークポイントを設定し、その時点でarg1の値を出力するか、(2)フレーム29のアセンブリ命令を調べて、関数が最初の引数をどこかに保存したかどうかを確認することです(スタック(不揮発性レジスタ内)を引き続き調べることができます。そうしないと、28スタックフレーム深くなるまでに、引数レジスタの内容はずっとなくなってしまいます。

于 2012-10-08T19:12:07.040 に答える