web-dev-qa-db-ja.com

Windowsサービスのデバッグ

シナリオ

C#で記述されたWindowsサービスがあります。私はそれをデバッグする方法についてすべてのグーグルスレッドを読みましたが、私はまだそれを動作させることができません。 「PathTo.NetFramework\InstallUtil.exe C:\ MyService.exe」を実行しました。インストールは成功しましたが、「Services.msc」を実行すると、サービスはどこにも表示されません。タスクマネージャーを開くと、「MyService.vshost.exe」というプロセスがあります。それはプロセスではなくサービスであるため、そうではありません。

誰かが私に説明できますか?

Services.mscの実行時にサービスを表示することになっている場合(念頭に置いて、これはすべてサーバーなしのローカルマシンで行われますAT ALL。

その他

VS2008を実行しています。

編集:

これはすべてローカルマシンで行われ、サーバーもアクセスもありません。また、私はサービスが何をするのかさえ知らないので、それをデバッグしたいので、コードをウォークスルーし、すべてがどのように機能するかを見ることができます(サービス自体ではなく、サービス内のコード-あなたのためにテンプレートを見ることをお勧めします)。

編集2:

これらのどれも機能していません!何かを試すたびに、NET STARTを使用するか、サービスをインストールする必要があるというメッセージが表示されます。

編集3:

VS2008を実行しています。

これを入力しました:C:\ WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe C:\ dev\Restarter\bin\Release\Restarter.exe

私はこれを得ました:Microsoft(R).NET Frameworkインストールユーティリティバージョン2.0.50727.3053 Copyright(c)Microsoft Corporation。全著作権所有。

トランザクションインストールの実行。

インストールのインストールフェーズの開始。 C:\ dev\Restarter\bin\Release\Restarter.exeアセンブリの進行状況については、ログファイルの内容を参照してください。ファイルはC:\ dev\Restarter\bin\Release\EDT.Restar ter.InstallLogにあります。アセンブリ「C:\ dev\Restarter\bin\Release\Restarter.exe」をインストールします。影響を受けるパラメーターは次のとおりです。logtoconsole = assemblypath = C:\ dev\Restarter\bin\Release\Restarter.exe logfile = C:\ dev\Restarter\bin\Release\Restarter.InstallLog

インストールフェーズが正常に完了し、コミットフェーズが開始されています。 C:\ dev\Restarter\bin\Release\Restarter.exeアセンブリの進行状況については、ログファイルの内容を参照してください。ファイルはC:\ dev\Restarter\bin\Release\Restar ter.InstallLogにあります。アセンブリ 'C:\ dev\Restarter\bin\Release\Restarter.exe'をコミットしています。影響を受けるパラメーターは次のとおりです。logtoconsole = assemblypath = C:\ dev\Restarter\bin\Release\Restarter.exe logfile = C:\ dev\Restarter\bin\Release\Restarter.InstallLog

コミットフェーズが正常に完了しました。

トランザクションインストールが完了しました。

C:\ Program Files\Microsoft Visual Studio 9.0\VC>

次にRUN-> Services.mscに行きましたが、何も表示されません。

「Restarter.vshost.exe」と呼ばれるプロセスがタスクマネージャーにあります。

それでおしまい。

私はそれをインストールしてデバッグしたかっただけです。私はそれが動作することを知っています(実行されてクラッシュしないので)。しかし、コードは友人によって書かれたものであり、デバッグモードでコードをウォークスルーすることで基礎となるコードを理解したいと思います。

41
Goober

デバッグには次のパターンをお勧めします。

 var ServiceToRun = new SomeService(); 
 if (Environment.UserInteractive)
 {
    // This used to run the service as a console (development phase only)

    ServiceToRun.Start();

    Console.WriteLine("Press Enter to terminate ...");
    Console.ReadLine();

    ServiceToRun.DoStop();
 }
 else
 {
    ServiceBase.Run(ServiceToRun);
 }

編集:ターゲットがWindowsアプリケーションではなくコンソールアプリケーションであることを確認してください。そうでない場合は動作しません。

116
Andrey

デバッガーをプロセスにアタッチすることでデバッグできます。これを行うには、プログラムのスタートアップに行を追加します。

Debugger.Launch ();

usingステートメントを追加した後:

using System.Diagnostics; 

それを条件付きブロックに入れるか、デバッグが完了したら削除する必要があります

または、サービスを実行してから、IDEからプロセスに手動でアタッチすることにより:デバッグ->プロセスにアタッチします。

23
Sam Holder

パラメーターを追加し、コンソールアプリのように動作させるだけで、Windowsサービスプロジェクトをデバッグ可能にできます。

1)Windowsサービスプロジェクトプロパティに移動->デバッグ->開始オプション2)引数を指定-コンソール3)アプリケーションタブに移動->出力タイプ、コンソールアプリケーションに変更4)Program.csに以下のコードを入力

static class Program
    {
        private static EventWaitHandle _waitHandle;
        private static Service1 _service;
                static void Main(string[] args)
        {
            bool runConsole = false;**

            foreach (string arg in args)
            {
                if (arg.ToLowerInvariant().Equals("-console"))
                {
                    runConsole = true;
                }
            }   

            _service = new Service1();
            if (runConsole)
            {
                _waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                Console.WriteLine("Starting Workflow Service in Console Mode");
                Console.WriteLine("Press Ctrl+C to exit Console Mode");
               Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
                _service.InternalStart();
                WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
            }

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };
            ServiceBase.Run(ServicesToRun);
        }

        static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            _service.InternalStop();
            _waitHandle.Set();
        }


    }
6
Lavanya

これは、Windowsサービスを開発/デバッグするときに非常に役立ちました。

http://windowsservicehelper.codeplex.com/

F5を押してデバッグします。非常に簡単。

アンドレイのアプローチも非常に優れています。

5
Ronnie Overby

サービスをデプロイせずにデバッグできるようにするために、私は常に次のように記述します。

Program.csファイルで:

#if DEBUG
    MyService myService = new MyService();
    myService.OnDebug();
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
        new MyService()
    };
    ServiceBase.Run(ServicesToRun);
#endif

myService.csファイルで:

    public void OnDebug()
    {
        OnStart(null);
    }

* NOTE *:デバッグが最終的に完了し、サービスを展開する準備ができたら、「リリース」モードでビルドする必要があります。そうしないと、サービスはサービスと見なされません。

お役に立てれば。

4
Minas

仮定:

1)VS2008 IDEのソリューションで利用可能なソースコードがある

C#サービスのデバッグ方法:

  1. InstallUtilを使用してサービスをインストールします。 (あなたはすでにそれをやったようです)
  2. (必要な場合) サービスパスの変更 ソリューションのbinフォルダーで生成されるMyService.exeに
  3. サービスのOnStart()メソッドの先頭に次のようなものを配置します。

    _while(true)
    {
       System.Threading.Thread.Sleep(500);
    }
    _
  4. System.Threading.Thread.Sleep(500)にブレークポイントを置きます

  5. ソリューションを構築する

  6. Windows Service Utility を使用してサービスを開始します

  7. サービスの開始中に、VS2008で_Debug -> Attach To Processes..._に移動します

  8. _Show Processes From All Users_および_Show Processes In All Sessions_がチェックされていることを確認してください

  9. リストでMyService.exeを見つけ、Attachをクリックします

  10. これで、無限ループに挿入したブレークポイントにいるはずです。

  11. コントロール(黄色の矢印)justを無限ループの外側にドラッグします

  12. デバッグしてください!

免責事項:

ビルドをリリースする場合、または単にサービスを通常どおりに実行する場合は、忘れずに無限ループを削除してください。

2
Onion-Knight

サービス名が予期したものではない可能性があり、それが見つからない理由です。サービス名は、.NETプロジェクトのServiceInstallerプロパティで定義されており、実行可能ファイル名と一致する必要はありません。ただし、インストール後にサービスがリストされていないことが確実な場合は、次のようにします。

まず、サービスのインストール。 2つのメソッドがあります、InstallUtil.exeおよびSC.exe。最初のコードは、すべてのProjectInstallerおよびServiceInstallerコードを実行するため、.NETサービス専用に調整されています。 2番目はそれを行いませんが、より多くのオプションを提供し、通常はより効果的です。つまり、InstallUtilが失敗した場合に成功する可能性があります。これは、インストーラーコードに例外がある場合です。

すでにInstallUtilでインストールしようとしているので、ここにSCバージョンがあります:

sc create MyService binPath= "C:\Service.exe"

MyServiceは、この時点でサービスに与える名前yoであり、任意の名前にすることができます(理由:-)。この名前は、サービスコンソールリストに表示されます。

サービスをインストールしたら、OnStartが呼び出されたときにすぐにデバッグする必要があります。これは、サービス内から実行してデバッガー(Visual Studio)にアタッチすることで実現できます。

protected override void OnStart(string[] args)
{
    #if DEBUG
    Debugger.Launch();
    #endif
    ...
}

このコードの変更後、サービス実行可能ファイルをビルドして置き換えることを忘れないでください。サービスを停止する必要がありますが、アンインストールして再インストールする必要はありません。

SCを使用してサービスを削除するには:

sc delete MyService
1
Maciej

プロジェクトプロパティの[デバッグ]タブに開始オプションとして/testを追加することをお勧めします。その後、インストールせずにサービスを実行できます。

0

ビジネスレイヤーがWindowsサービスから分離されている場合は、Windowsサービスの実行以外ですべてのビジネス機能をテストできます。

Windowsサービスをテストするには、コンソールアプリであるテストプロジェクトを作成し、サービスを実行する新しいスレッドを開始します。

System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
service1.Start();
0
Dan H

私は最近これをプロジェクトに追加しました。他のEXEと同じようにデバッグできます。追加した後、プロジェクトプロパティに移動し、デバッグビルド構成の[デバッグ]タブでコマンドラインパラメーター(/ EXE)を追加します。

<MTAThread()> _
Shared Sub Main()

    '' 
    '' let's add a command line parameter so we can run this as a regular exe or as a service
    ''
    If Command().ToUpper() = "/EXE" Then
        Dim app As MyService = New MyService()

        app.OnStart(Nothing)
        Application.Run()
    Else
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase

        ' More than one NT Service may run within the same process. To add
        ' another service to this process, change the following line to
        ' create a second service object. For example,
        '
        '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
        '
        ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService}

        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End If
End Sub
0
Greg Bogumil

TopShelfを使用してサービスを作成すると、Visual Studioから簡単にデバッグできるはずです。

0
Efe Ariaroo