クラッシュ ダンプで各スタック フレームのレジスタの内容を表示する方法はありますか? レジスタ ウィンドウには、例外が発生したときのレジスタが含まれているように見えますが、各スタック フレームでそれらの内容を確認できると便利です。
4 に答える
呼び出し規約によっては、スタックに保存されているレジスタの一部を取得できます。たとえば、cdecl 呼び出し規約では、EAX、ECX、および EDX を除くすべてのレジスタを、呼び出し元または呼び出し先のいずれかが保存する必要があります。これら 3 つのレジスタは破壊可能であるため、通常、コール スタックの上位からそれらの値を取得することはできません。保存する必要があるレジスタを関数が使用しない場合、関数はそれを保存しませんが、使用しないため、そのレジスタは次に高いスタック フレームで同じ値を持ちます。
いくつかの調査を行い、これについて少し考えた後、おそらく不可能であることに気付きました. クラッシュ ミニダンプは、(MiniDumpWriteDump() 関数に渡されたフラグに応じて) プロセス メモリの特定の領域と、デバッガーでクラッシュが発生した環境を再作成するのに十分な状態情報を保存します。各命令または各スタックフレームでのプロセッサの状態はありません。例外が発生したときのプロセッサの状態についてのみ知っています。
最適化されたビルドでは、スタックの一部の情報が破棄される可能性があるのは事実ですが、デバッガーに特定のスタック フレームの情報を試して表示するように依頼することができます。最初に " kn
" を実行してフレーム番号付きのスタックを表示し、次に " .frame /c [frame]
" または " .frame /r [frame]
" を試してください。
詳細については、ヘルプ (" .hh
") を参照してください。
デバッグ時にも取得できないと思います。レジスタから取得できる唯一の値は、現在の命令での値です。