11

ここで見ることができる(現在および前のすべてのフレームからの)スタック内のすべての変数をダンプしたかった私の前の質問に続いて:C#で実行時にスタック変数を調べる方法はありますか?

このようなタスクを簡素化するために、呼び出しを手動でインターセプトするか、PostSharpなどのAOPフレームワークを使用することをお勧めしました。PostSharpを調べましたが、インターセプト引数に現在のスタックフレームの変数が含まれていません。現在のスタックフレーム内のすべてのローカル変数を自動的に取得する簡単な方法があるのだろうか。コード分​​析を実行して、それらすべての値をコレクションにコピーするコードを生成できると思いますが、それを実行する組み込みのメカニズムがあるかもしれません。

提案を事前に感謝します。

編集:私はこれをしたい理由の詳細を与えるべきでした。メソッドの途中で実行を一時停止できるようにしたい。スタックの内容があれば、後で実行を再開したり、シリアル化して別のマシンで続行したりすることもできます(比較的単純なコードであるため、スレッドやI / Oはありません)。この状態を保存する追加のコードを自動的に生成できるコード分析ツールを実行しても問題ありません。これを行うには、おそらくCILを分析する必要があると思います。

4

3 に答える 3

8
   System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace();
        System.Diagnostics.StackFrame frame = trace.GetFrame(0);
        MethodBase method = frame.GetMethod();
        MethodBody methodBody = method.GetMethodBody();
        if (methodBody != null)
        {
            foreach (var local in methodBody.LocalVariables)
            {
                Console.WriteLine(local);
            }
        }
        Console.ReadKey();
于 2011-02-27T21:31:38.993 に答える
8

デバッグAPIを使用して、別のプロセスからプログラムをデバッグする必要があります。独自のマネージデバッガーを作成することは簡単ではありませんが、少なくとも、指定された目標を達成するためのサポートされている方法です。

私の知る限り、マネージド.Netフレームワークには、メソッドのローカル変数の実行時の状態に関する情報を収集するために使用できるものはありません。

ローカル変数の値が存在しない場合、それらを処理するための一般的なコードの記述を複雑にするのに十分な場合があることに注意してください。

  • メソッドはインライン化できます(ローカル変数は呼び出し元のメソッドとマージされます)
  • ローカル変数を最適化できます
  • ローカル変数はスコープ外になり、メソッドの終了前にガベージコレクションされる可能性があります。
于 2011-02-27T23:06:10.727 に答える
3

カスタムPostSharpアスペクト(IL変換を使用)を使用してミニダンプを作成することを検討してください。

C#で記述された共有デバッグエンジンライブラリ。NuGetではMicrosoft.Samples.Debugging.MdbgEngineとして利用できます。

このコードは、 PADRE(Pluggable Automatic Debugging and Reporting Engine)リポジトリの一部としてGitHubで入手できます。

于 2012-12-02T03:00:23.287 に答える