23

.NET アプリケーションでは、現在のスレッド状態に関するデバッグ情報を収集する必要があるポイントがいくつかあります。new StackTrace()情報コンストラクターを取得できます。特に、対応するオブジェクトを含む現在のスタック フレームのリストを取得できMethodInfoます。これにより、IL コード、ローカル変数とパラメーターの数、およびパラメーター名を得ることができます。

これらのローカルとパラメーター (少なくともプリミティブ型) の現在のを取得するにはどうすればよいですか?

アプリケーションにデバッガーを手動でアタッチすることはできませんが、アプリケーションは必要に応じて新しいプロセスを生成できます。

4

5 に答える 5

2

MethodInfo やその他の詳細を取得するために使用しているリフレクションは、コンパイル時に作成されたメタデータを使用します。つまり、アクセスしているデータは、必要な実行時データとは関係ありません。

デバッガーを使用できないとおっしゃいましたが、そのとおりです。製品コードでは通常、アセンブリにデバッグ シンボルが読み込まれないためです。そこではデバッガは役に立ちません。

ここで重要なことは、.NET アーキテクチャごとに、アセンブリを実行すると "ジッター" が実行され、IL コードがネイティブ コードに変換されることです。その結果、メモリに読み込まれるのは純粋なマシン コードであり、値を取得するために簡単にハッキングすることはできません (理論的には可能ですが)。言及されているもう1つのポイントは最適化です-それらがオンである限り、メソッドが消えて(インライン化されている)、実行順序が変更され、変数がリテラルに置き換えられる可能性があります。コンパイラは、コードをより高速に実行するために多くのことを行います。


実行時にローカルの値を取得するための適切な解決策はわかりませんが、インターセプト手法を使用してパラメーターの値を取得する方法はあると思います。PostSharpができることを見てみましょう。

于 2013-08-08T12:10:31.513 に答える
0

Postsharp を使用することをお勧めします。これは、アスペクト指向プログラミングとコード インジェクションに基づいています。メソッドでパラメーター値を取得できます。

ニーズの一部を解決できるかもしれません。

于 2013-08-13T20:29:02.607 に答える
0

ロギングはかなり単純なはずです。ログ ファイルを作成するか、WriteLine() を実行します。

このドキュメントが役立つ場合があります- http://msdn.microsoft.com/en-us/library/tss153kw.aspx

于 2013-08-07T15:50:12.080 に答える
-1

変数の値をコンソールまたはログ ファイルに書き込むことができますか?

System.Diagnostics.Debug.WriteLine("Value of my variable: "+myvariable);
Console.WriteLine("Value of my variable: "+myvariable);
于 2013-05-27T03:26:39.233 に答える