2012-06-01 18 views
5

単純なウィンドウサービスを作成していますが、デバッグするときに「ネイティブフレームがコールの先頭にあるため式を評価できませんスタック。"。また、Releaseでサービスをビルドして実行すると、ハングするだけです。ネイティブフレームがコールスタックの上にあるため式を評価できません

static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new MyService1() }; 

     ServiceBase.Run(ServicesToRun); 
    } 

これは、通常はServiceBase.Run(ServicesToRun)行にハングするProgram.csファイルにあります。

私が見つけたことは、コードが最適化されているか、asp.netとresponse.redirectを処理する必要があるため、評価されていない式だけです。

サービスコード。

public TruckRateClearService() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     tmrProcess.Enabled = true; 
    } 

    protected override void OnCustomCommand(int command) 
    { 
     base.OnCustomCommand(command); 
     if (command == 129) 
     { 
      OnStart(null); 
     } 
    } 

    protected override void OnStop() 
    { 
     tmrProcess.Enabled = false; 
    } 

    private void tmrProcess_Tick(object sender, EventArgs e) 
    { 
     tmrProcess.Enabled = false; 

     try 
     { 
      eventLog.WriteEntry("Clearing Truck Rates Start" + DateTime.Now.ToString()); 

      TruckRateClearingAgent.Process(); 

      eventLog.WriteEntry("Clearing Truck Rates Finished" + DateTime.Now.ToString()); 
     } 
     catch (Exception ex) 
     { 
      eventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error); 
     } 

     tmrProcess.Enabled = true; 
    } 

    internal void Run() 
    { 
     tmrProcess_Tick(tmrProcess, null); 
    } 

ErenErsönmezのコメントの提案に、Internal Void Run()が最近追加されました。彼の考えは、私が残りを把握できるようになるまで、私のロジックをデバッグするのに非常に役立っています。

Nativeコールスタックに入ることができました。それは、1つの場所、76F17094 retにあります。今私はこれが何であるか分かりませんが、他の誰かがそうするかもしれません。

また、私がサービスを開始し、それをVSに接続すると、2つのインスタンスに気付いています。 1つは通常の.exe、もう1つは.vshost.exeです。他のサービスを開始すると、デバッガのAttach to Process部分にある.exeファイルのみが表示されます。これは、v4 Framework(.vshost.exeサービス)とv2(単一の.exeサービス)Framework上にあるためですか?

私はそれが働いていると思います。問題は私が使っていたタイマーで嘘をついたようです。私が使用していた元のタイマーは、System.Windows.Formsタイマーでした。私はそれをSystem.Timers.Timersに切り替え、すべてが再び働き始めました。それでもVSを添付することはできませんが、Internal Run()メソッドを使用してそれをデバッグすることはできます。

答えて

2

N、N-すべての助けのおかげで問題

この通知は、スレッドが現在、アンマネージコードを実行されるため、式の評価に使用することができないことを意味します。

式を評価する前に、呼び出しがマネージコードに戻るのを待つことがあります。残念ながら、このような状況では、サービスを停止するまでは発生しません。

代替

あなたはServiceBase.OnCustomCommandメソッドをオーバーライドして、あなたの式を評価することができるようにそこにブレークポイントを置くことを検討してください。次のように

protected override void OnCustomCommand(int command) 
{ 
    //Debugger.Break() <- or just put a breakpoint in here. 
} 

カスタムコマンドを呼び出すことができます。

c:\>sc control YourServiceName 129 
+0

私はすべてを置いて、コマンドを実行し、それは働いた。しかし、私がその機能を踏んだとき、私はそれ以上進歩させられませんでした。そして私がDebug-> Break Allに行ったとき、それはサービスが失敗していたのと同じ時点でした。私はここで何か間違っていると思う。 –

+0

どのような障害が発生していますか?ハングまたは例外? –

+0

私は前に "表現を評価できませんでした..."と同じでした。サービスはServiceBase.Run(ServicesToRun)部分にハングアップするだけでしたか? –

0

あなたがアンマネージコードが例外を投げているので、.NETデバッガはあなたにいつものを表示することができない手段を見ている例外を有用な詳細。

MyService1()で何をしていますか?あなたはその中にコードを投稿できますか?

また、環境から起動するだけでサービスをデバッグしようとしていますか。それはうまくいかないかもしれません。

私は通常、このような何かを書く:

static void Main(params string[] args) 
{ 
    if (args.Length > 0 && args[0] == "/console") 
    { 
     // Run whatever your service calls here 
    } 
    else 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new MyService1() }; 

     ServiceBase.Run(ServicesToRun); 
    } 
} 

次に、プロジェクトでデバッグ]タブの下のプロパティは、コマンドライン引数として/consoleを入力してください。アプリケーションにステップインしてデバッグすることができます。 http://msdn.microsoft.com/en-us/library/7a50syb3(v=vs.80).aspx

+0

私はもともとサービスを再インストールし、VSをそれに接続していました。私はErenのアドバイスを見て、それを私のコードに追加したので、通常のデバッガを使用することができました。しかし、まだ管理されていないコードは見つかりませんでした。プロジェクトのプロパティに入り、「安全でないコードを許可する」を有効にするのは安全でしょうか? –

+0

こちらの手順をお試しください:http://msdn.microsoft.com/en-us/library/tdw0c6sf(v=vs.80).aspx – greg84

2

あなたの主な問題は、Windowsサービスexeを直接実行しようとしていることです。 Windowsサービスは、Service Control Manager(SCM)を介してのみ開始できます。あなたは、サービスループを実行し、新しいスレッドを生成しますMyService1.Runメソッドを作成したい

static void Main() 
{ 
    if (Environment.UserInteractive) 
    { 
     new MyService1().Run(); 
     Thread.Sleep(Timeout.Infinite); 
    } 
    else 
    { 
     ServiceBase.Run(new ServiceBase[] { new MyService1() }); 
    } 
} 

:VSでデバッグすることができるようにするために、私はこのようなものをお勧めします。また、同じRunメソッドをMyService1.Onstartから呼び出すこともできます。

このスキームは、SCMで起動するとサービスとして実行されますが、VSでデバッグされている(またはVSの外部でexeとして直接実行されている)場合、通常のexeのように扱います。

関連する問題