StackWalk64 を使用して、x64 プロセスでマネージ フレームとネイティブ フレームの両方を含むコールスタックをウォークしようとしています。最初または 2 番目のマネージド フレームまではすべて正常に動作しますが、その後、StackWalk64 はフレームのリターン アドレスを特定できず、失敗します。
関数テーブル アクセス コールバックに SymFunctionTableAccess64 を使用しており、シンボル ハンドラは SymInitialize() で初期化されています。dbghelp でマネージ フレームを正しくウォークスルーするために必要な魔法はありますか?
失敗するコールスタックの例:
UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart
注:この質問は、管理されたフレームをシンボル/メソッド名などに解決する方法に関するものではありません。シンボルの解像度などに関係なく、スタック全体を調べたいだけです 。
また、IDebugControl4::GetContextStackTrace は正しく機能しますが、DbgEng はカスタム関数テーブル コールバックを使用し、単純に SymFunctionTableAccess64 に委任しません。問題は、CLR が RtlInstallFunctionTableCallback を使用してコールバック関数テーブル (mscordacwks を指す) をインストールすることであり、SymFunctionTableAccess64 はそれに従うほどスマートではないと思われます。
カスタム関数テーブル アクセス コールバックを記述して、関数テーブル チェーンをトラバースし、mscordacwks でコールバックを呼び出すことに時間を費やしましたが、かなり大ざっぱで、実際には機能しませんでした。