23

実行時にすべての変数をメモリに単純にダンプできる組み込みまたはサードパーティのライブラリはありますか?私が望んでいるのは、ブレークポイントに到達して変数にカーソルを合わせると、変数と現在の値を表示するのと同じように表示できるようにすることですが、実際にプログラムの実行を停止する必要はありません(つまり、スナップショットを取得するだけです)。それらをファイルにダンプして、後でプログラムで開いて、それらを表示するための優れたGUIインターフェイスを取得できればよいのですが、単純なテキストファイルのダンプで十分です。

4

6 に答える 6

7

これを一般的な方法で行う簡単な方法は考えられません。動作する可能性があるのは、実行中のプロセスのダンプ ファイルをプログラムで作成することです。dbghelp.dllルーチンに対して P/Invoke を使用してこれを行うか、 cdb.exeプロセスを生成してダンプ ファイルを作成することができます。ファイルを取得したら、後で分析するためにデバッガーで開いて、 cdb.exe/windbg.exe で SOS.dllを使用するか、必要なデータを (ほとんど) 自動的にダンプするデバッガー スクリプトを作成することもできます。

于 2009-10-12T03:06:41.433 に答える
3

ある種のロギングフレームワークがそれを行うのに役立つと思います...

チェックアウト:

http://www.dotnetlogging.com/

私の職場では、私たちにとって非常にうまく機能するlog4netを使用しています。

では、後で分析するためにすべての変数をダンプしたいのはなぜでしょうか? デバッガーへの依存を減らし、一連の自動テストで値をチェックできるように、最初にコード テストを作成することを検討しましたか?

于 2009-10-12T03:00:56.797 に答える
2

過去に、.Net アプリケーションのプロファイルを作成するために、YourKit .Net プロファイラーを使用しました。

個人的に実行中のアプリケーションに接続するためにのみ使用したことがありますが、スナップショットのドキュメントには、後で確認するためにスナップショットをプログラムでダンプするために使用できるプロファイラー APIがあると記載されています。

コード的には、これは次のように単純に見えます。

Controller c = new Controller();
String snapshotPath = c.CaptureSnapshot();

後でスナップショット ファイルを YourKit GUI に読み込んで確認できると思います。

JetBrains dotTrace Performanceや RedGates ANTS Performance Profilerなどの他の人気のあるプロファイラーが同様のプログラム API を持っていても驚かないでしょうが、それらの Web サイトで明らかなドキュメントをすぐに見つけることができませんでした (そして、それらのウェビナーを見て見つけたくありませんでした)。この機能が存在する場合はアウト!)

于 2012-11-13T00:38:04.310 に答える
1

このために、 WMemoryProfilerを使用して

  • すべてのアプリケーション ドメインのすべてのオブジェクトをオブジェクト配列として取得します
  • 独自のプロセスのメモリ ダンプを作成する
  • 特定のオブジェクトをディスクにシリアライズする

これを実現するには、もちろん Windbg が必要ですが、WMemoryProfiler の Api は完全に管理されており、基本的にプロセスを自己デバッグできます。このライブラリは、Windbg を適切なアクセス可能なライブラリにラップするため、通常のデバッガの奇妙な点を処理します。

以下のコードは、System.Threading.Thread オブジェクトのすべてのインスタンスをオブジェクト配列に取得します。このようにして、実行時に独自のアプリケーション オブジェクトのビジュアライザーを作成できます。もう 1 つのオーバーロードは、すべての AppDomains 内のすべてのオブジェクトを単純に提供します。

using (var debugger = new MdbEng())
{
  var dummy = new Thread(() => {});
  dummy.Name = "Dummy Thread";

  // Get all thread objects in all AppDomains
  var threads = debugger.GetObjects("System.Threading.Thread", true);

  foreach (Thread t in threads)
  {
    Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name);
  }
  GC.KeepAlive(dummy);
}

これは Windbg のラッパーであるため、オンザフライでメモリ ダンプを作成し、後でプロセスからメモリ ダンプをロードして、ダンプから可視化するオブジェクト データを抽出することもできます。市販のメモリ プロファイラー (Scitech の MemoryProfiler など) は何年も前からこの手法を採用していますが、ダンプ アナライザーとして Windbg も使用しているため、巨大なメモリ ダンプがあると非常に遅くなります。

于 2012-11-17T14:49:09.837 に答える
0

PostSharpを使用できます。アプリケーションがデプロイされた環境のため、デバッグ時間を記録することは非常に便利であることがわかりました。そして、多くのことを計装/録音しました。

ただし、明らかに、記録する必要があるすべての変数を指定する必要があります。

詳細はこちらをご覧ください。

于 2012-11-14T16:37:26.600 に答える
0

Visual Studioの究極版に付属するIntellitraceツールを試すことができます。それはあなたが説明するものです-アプリで何が起こっているかを記録し、変数や他のすべてのデバッグウィンドウにカーソルを合わせてプログラムを実行せずにデバッグできるようにします.

于 2012-11-13T08:43:19.010 に答える