5

Windows サービスとして使用される C# プログラムがあるとします。サービスが暴走し、CPU とメモリを狂ったように消費しているとしましょう。これは本番システムであるため、すぐに再起動する必要があります。そのため、実行時の情報を収集する時間があまりありません。たぶん、タスクマネージャーをざっと見てください...それだけです。

その後、私が持っているのは、事後分析用のlog4netログファイルとWindowsイベントログだけです。

問題の原因がわかったとします。他の誰かがそれを修正し、おそらくプログラマーが追加のログを追加するので、次回同様の問題をより迅速に見つけることができます. それにもかかわらず、私はまだログ ファイルの品質に依存しており、次回は何らかの形でログに問題が現れることを願っています。

事後分析を行う他の方法もありますか? スレッド ダンプ (Java など)、メモリ ダンプなど、事後分析に役立つものでしょうか? ビルトインの .NET フレームワーク ツールが役立つのではないでしょうか?

私は実際のプロジェクトの経験と、ほとんどのプログラマーにとって非常に現実的なこのメンテナンスの問題にどのように取り組もうとしているのかに非常に興味があります。

4

5 に答える 5

2

.NET でクラッシュ ダンプを作成し、windbg / sos (および sosassist) でそれらを確認できます。単純ではありませんが、機能します。でもかなりハード。「+windbg +.NET」で検索すると興味深いことがわかるはずです。

それ以外 - リソースカウンター?ログファイル?あなたが見ているかもしれない多くのことは、かなり簡単に有効にすることができます.

于 2009-01-18T13:33:01.523 に答える
2

WinDbg + SoS を使用すると多くの問題をデバッグできると Marc が言っているように、Visual Studio では実際に対処することはできません。このブログには優れたチュートリアルがいくつかあります。

メモリの問題については、Perfmon で .NET パフォーマンス カウンターを確認することもできます。オブジェクトが配置されている場所 (世代) と、ガベージ コレクションに費やされた時間を調べることができます。それはあなたにいくつかの有用な情報を与えるはずです。オブジェクトが収集されていない理由を知りたい場合は、WinDbg と SoS が最適です。簡単なセッションの手順は次のとおりです。

  1. を使用してヒープを検査し、!dumpheap -stat多数のインスタンスを探します。あなたはおそらく、ヒープ上で何が見つかると予想されるかについてある程度の考えを持っているので、異常に見えるものがある場合は、それを調べてください。

  2. ランダムなインスタンスを選択し!gcroot、インスタンスのアドレスに対して a を実行します。これにより、オブジェクトが収集されていない理由がわかります。

  3. 繰り返す

必要以上に長く存続させる可能性が高い候補は、いくつか例を挙げると、イベント、静的、およびファイナライザー キューです。

この質問に対する私の回答を見て、WinDbg の詳細を確認することもできます。

于 2009-01-18T13:59:16.400 に答える
1

残念ながら、私はこれをかなりの量行う必要がありました-私が遭遇した最高のツールは、SDKに付属するcordbgです(.netバージョンに適したバージョンが必要です)。詳細については、 http://msdn.microsoft.com/en-us/library/a6zb7c8d.aspxを参照してください。

cordbg(a <[pid]>)で実行中のプロセスに接続し、実行中の各スレッド(t <[tid]>)に接続してから、各スレッドのスタックをダンプします(w)。

小さなvbスクリプトを使用してこのタスクを自動化し、ファイルにダンプすると、このツールを何度も実行して、出力をファイルにキャプチャできます。すべてのスレッドスタックを比較すると、アプリケーションが時間を費やしている場所について非常に良いアイデアが得られます。

このアプローチの良いところは、特にダンプを自動化することで、すべての情報を非常に迅速に取得し、最短時間でプロセスを再開できることです。

于 2009-01-18T15:18:18.720 に答える
1

WinDbg と SOS を使用した事後分析の優れたリソースは、この件に関する Tess Ferrandez の一連のブログ エントリです。

編集:リンクが更新されました

于 2009-01-18T13:56:17.730 に答える
0

プロセスがまだ稼働している場合は、そのプロセスに対してManaged Stack Explorerを実行して、そのプロセスの簡単なスナップショットを取得できます。これは、明示的なインストールなしで実行できます。

それ以外では、完全なダンプ + windbg + SOS でほとんどの情報が得られますが、それを取得するのは簡単ではありません。

于 2009-01-18T14:09:55.317 に答える