3

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 でコールバックを呼び出すことに時間を費やしましたが、かなり大ざっぱで、実際には機能しませんでした。

4

1 に答える 1

0

SOS デバッガ拡張機能は役に立ちますか? それは、あなたが望む方法で正確にスタックからwindbg出入りする機能を提供します。Visual Studio

あるいは、Profiler Stack Walking in the .NET Framework 2.0: Basics and Beyondが役に立つかもしれません。

于 2011-04-13T18:56:48.357 に答える