C# で記述された Windows サービスがあります。デバッグ用のスタンドアロン コンソール モードも含まれています。これまでに実行されたほぼすべてのコンピューターで正常に動作しますが、このサービスを開始しようとするとロックアップし、タイムアウトのために強制終了されるという状況に遭遇しました。しかし、同じマシンでコンソール モードで実行すると、問題なく起動します。
これが発生しているマシンに実際にアクセスできないため、デバッグは面倒です。人間のプロキシを経由する必要があります。しかし、試行錯誤のデバッグを重ねた結果、最終的に原因をアセンブリの読み込みに絞り込みました。ログ ファイルによると、特定の dll 内の任意のデータ型への最初の参照に到達すると、そこで停止します。例外を与えるわけでもなく、ロックするだけです。
[編集] さらに調査した結果、永久にロックされているわけではないようです。実際にライブラリのロードを完了するのに約 40 秒かかります。これは、Windows サービスがプロセスを強制終了することを決定するのに十分な時間です。
この種の状況をデバッグする方法の手がかりはありますか?
これが私がそれを再現できる最も簡単な解決策です。「Before」は表示されますが、「During」と「After」は表示されません。
private static void LoadAssembly()
{
Log("During");
MyNameSpace.MyClass x = new MyNameSpace.MyClass();
}
static void Main(string[] args)
{
try
{
// Leaving out code to handle command line parameters
// ...
//
Log("Before");
LoadAssembly();
Log("After");
if (Environment.UserInteractive)
{
Log("Starting in console mode");
ConnectionManager.Listen();
}
else
{
Log("Starting in service mode");
ServiceBase.Run(new RunAsService());
}
}
catch (Exception ex)
{
Log(ex.ToString());
}
}