2

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());
    }
}
4

2 に答える 2

1

アセンブリの接続には 45 秒かかりました。アセンブリをロードする前にインターネットに接続してアセンブリに関する何かを確認しようとしましたが、その特定のマシンではファイアウォールによってブロックされていました。開始を試みてから 30 秒後に、Windows サービス マネージャーはあきらめてプロセスを強制終了します。

サービスが開始されるまでアセンブリの読み込みを移動すると、サービスが適切に開始されます (ただし、応答を開始するまでに 45 秒の遅延が発生します)。

発行元の証拠の生成に関連していたようです。ここからhttp://msdn.microsoft.com/en-us/library/bb629393.aspx :

起動時のパフォーマンスを向上させるために、サービスでこの要素を使用することをお勧めします。この要素を使用すると、タイムアウトやサービスの起動のキャンセルを引き起こす可能性のある遅延を回避するのにも役立ちます。

app.config ファイルに次を入れると、遅延が解消されます。

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>
于 2010-08-23T22:03:23.590 に答える
0

ローダーロックを保持しながら、モジュールのロードで何かをしていますか?

デバッグについては、次の記事を参照してください: http://msdn.microsoft.com/en-us/library/ms172219.aspx

于 2010-07-20T19:34:25.577 に答える