17

次のようなものを使用して、StackTraceによってパラメーターに関する情報を取得できます。

catch (Exception ex)
{
    var st = new StackTrace(ex);

    System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First();
}

パラメータの値を取得する方法を知りたいです。例:

スタックトレースのメソッドが次のような場合:

void MyMethod(object value)

そして、その呼びかけは次のようでした。

MyMethod(10);

値10を取得したいのですが、どうすればよいですか?

4

2 に答える 2

10

2つの方法があります。より強力なのは、.NETデバッグ用のCOMAPIです。たとえば、呼び出しスタック内の引数と関数のローカル変数は、どちらもICorDebugILFrameからアクセスできます。ただし、これは、デバッガーとしてプロセスに接続されている別のプロセスから実行する必要があります。

インプロセスイントロスペクションには、プロファイラーAPIがあり、関数の引数に関する情報も見つけることができます。「シャドウスタック」に関する情報を見てください。

于 2012-05-26T20:58:57.900 に答える
3

高度にCLR(パッチ)バージョンに依存するソリューションを作成している場合を除いて、C#では使用できません。しかし、機能するのは、Windbgをプロセスに接続し、sos.dllスイッチをスレッドにロードして次のように入力することです。

!ClrStack -p

ほとんどのメソッドのマネージドコールスタックとメソッドパラメータを表示します。インライン化とJITの最適化により、スタックレイアウトが非常に柔軟であるため、これはデバッガーの下でも絶対確実ではありません。これに加えて、一部のパラメーターは、レジスター(x64プラットフォームではさらに一般的)を介して渡されるため、スタックメモリに表示されない場合があります。

あなたの最初の質問に答えるために。いいえ、あなたが試みているアプローチでは不可能です。実用的な解決策は可能ですが、まったく移植性はありません。マネージドデバッガーは引数を部分的に取得できますが、100%機能するソリューションはありません(デバッガーの下でも)。

于 2012-05-26T20:55:47.387 に答える