3

複数の VS2010 プロジェクト/ソリューションから複数の DLL をロードする大規模なマルチスレッド C# プログラムを開発中です。それをデバッグすることは、私が予想していたよりも難しいことがわかりました (誰が思うでしょうか)。

問題は次のとおりです。多くの場合、いくつかのステップ オーバーやブレークオール操作の後、プログラム (またはおそらくデバッガー) は、実行も停止もされていない、ある種の不確定な状態に入ります。Debugメニューで、Continueとの両方Break Allがグレー表示されているため、プログラムで作業を続けることができません。

常にではありませんが、これが発生すると、ウォッチ ウィンドウに次のメッセージが表示されることがあります。

前回の関数評価がタイムアウトしたため、関数評価が無効になりました。

プログラムは実行されていないようで (出力がなく、ブレークポイントで停止していません...)、停止しているようにも見えません (Watchウィンドウはグレー表示され、Call Stackウィンドウは空です)。

Stop DebuggingRestartコマンドが使用可能で機能しています。

セッションを何度も再起動せずに、正常にデバッグできるようにするために何かできますか?

私は Windows 環境での開発に慣れていないため、明らかな何かが欠けている可能性があります。

4

1 に答える 1

2

@Conrad Frix が言ったように、最善の選択肢は、メモリ ダンプを取り、スレッドが何をしているかを調べることです。Windows と .Net の開発に使用できるツールは多数ありますが、それぞれがテーブルに少し異なるものをもたらします。

Windbg - テキストベースのメモリ検査. フレームワーク/OS を深く掘り下げ、スレッド スタックを調べるのに最適ですが、かなり急な学習曲線があります。(ただし、これ以上強力になることはありません)

JetBrains dotTrace - 使用する場合は Reshaper と統合されています。私の経験では最高の結果ではありません。

RedGate ANTS - 「モダンな」GUI ベースのプロファイラーの中で私のお気に入り。これにより、スレッドが何を行っているかについて非常に優れた洞察が得られますが、アプリケーションに何百ものスレッドがある場合、操作が少し難しくなる可能性があります。

Jetbrains と RedGate は有料の製品であるため、問題を解決するには無料試用版を使用する必要があります。

于 2012-11-21T15:51:28.033 に答える