- - PR -
Windowsサービスのデバッグ方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-07 16:22
KKKさん、こんにちは。
開始してからアタッチするので出来ないんじゃないでしょうか…。
タイマーが無効になっているとか、って事は無いですよね? あと、間違いなくイベントハンドラを通ってますか? | ||||||||
|
投稿日時: 2005-10-07 16:25
開始する時はまだアタッチしていないので無理なんじゃないですか? >またやはりタイマーイベントでも止まりませんでした タイマーが動いているのは確実ですか? どうやってそれを確認していますか? | ||||||||
|
投稿日時: 2005-10-07 17:36
こんにちは。
#私は.NET素人などで、間違いがあったらスイマセン。 #WindowsAPIを使用したWindowsサービスの開発経験はあります。 私であれば、こういうバックグラウンド処理プログラムなどは、 ファイルなどにトレース出力したりしてデバッグします。 #私は主に「組み込み/リアルタイムシステム系」技術者なので、 #トレース出力することが当たり前になってます。 Windowsサービスにはどうせ、ログを出力する機能は必須になってきますし… Windowsのイベントログサービスを用いるのが通例ですね。 > またやはりタイマーイベントでも止まりませんでした タイマーというのは、Windowタイマーのことでしょうか? 隠しウィンドウ(フォーム)を作成して、 そのウィンドウに対してWM_TIMERを通知させているのでしょうか? 私の認識では… こういうサービスプログラムでは、Windowタイマーは用いません。 スリープ(Sleep)やウェイト(WaitFor...)を使って、スレッドを待機状態にします。 あくまでバックグラウンド処理なので、できるだけCPUに負担をかけないように気を使います。 一定間隔で処理を行いたい場合は、サービススレッドをスリープさせてはどうでしょう。 SCM(サービスコントロールマネージャ)からの制御要求もちゃんと受け付けられるように配慮する必要がありますが。 [ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2005-10-07 17:43 ] | ||||||||
|
投稿日時: 2005-10-07 21:17
.NETでサービスを作ったことは無いですけれど、参考までに
サービスのデバッグは面倒なので、可能な限りWindowsアプリケーションの状態でデバッグを行うようにしています。Windowsアプリケーションとサービスの差異は、UIが存在しない事と、実行時のユーザー権限が異なることです。その点を意識してテストしていれば、そうはまる事は無いと思います。 ネィテブC++でサービスを作っている時には、DebugBreak()API等でデバッガに落としていた記憶があります。でも流石に.NETでは機能しない予感。 .NETではDebugger.BreakやDebugger.Launchが上記APIに相当するみたいだけど、どんな動作をするかは、使ったことが無いので・・・。美味く出来たら教えてください。 | ||||||||
|
投稿日時: 2005-10-08 06:51
下の www のリンクから、私のウェブページへ。
→「プログラミング全般に関するTips」の中の2つめ、 →「デバッグのしかた」の下の方、 →「番外:Windows サービスのデバッグの仕方」 _____________________________________________________________________________ □ Posted by Jitta on 2005/10/08 □ じったのノート □ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ | ||||||||
|
投稿日時: 2005-10-11 13:09
Tdnr_Symさん、こんにちは。
.Net では、Win32API を意識せずに、.Net Framework のライブラリ API だけを使用して Windows サービスを開発する事が可能です。 そして、時限発火装置としては、System.Timers.Timer というクラスがあり、IDE を使用すれば、まさにフォーム上にコントロールを配置するように Timer コンポーネントを使用できます。 ↓参考までに。 チュートリアル : コンポーネント デザイナによる Windows サービス アプリケーションの作成 | ||||||||
|
投稿日時: 2005-10-11 14:19
きくちゃんさん、こんにちは。
下記↓の記述ですね。私はてっきりOnStartメソッドか何処かでループ処理用のスレッドを作成して、そのスレッド(サービススレッド)でポーリングなんかをするんだと思っていました。失礼いたしました…orz
あと、.NETには、3種類のTimerクラスがあるんですね〜 ・System.Timers.Timer ・System.Windows.Forms.Timer ・System.Threading.Timer 私は「System.Windows.Forms.Timer」のようなタイマーしかないかと思っていました。勉強不足でした。orz。 | ||||||||
|
投稿日時: 2005-10-11 19:13
みなさん、ありがとうございます。
最近チェックしていませんでしたので、返信できませんでした。 一郎さんのおっしゃる通り、タイマーイベントが本当に発生しているかどうか を確認する必要がありました。 確認したところ、発生していないようでした。 ということは、デバックできないではなく、タイマーイベントが発生していない だけでした。 確認不足で申し訳ありません。 しかし、タイマーイベントが発生しない原因がいまのところ掴めていません。 やっていることは、以下の通りです。 Protected Overrides Sub OnStart(ByVal args() As String) JobTimer.Interval = 60000 JobTimer.Enabled = True AddHandler JobTimer.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf jobTimer_Elapsed) jobTimer_Elapsedイベントが発生していないようです。 (デバッグしてみましたが、止まりませんでした。 またイベントログにログを吐くようにしたのですが、何も出力されていませんでした) |