- PR -

Windowsサービスのデバッグ方法

投稿者投稿内容
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-10-07 16:22
KKKさん、こんにちは。

引用:

開始するときのイベントではデバッグできません。


開始してからアタッチするので出来ないんじゃないでしょうか…。

引用:

またやはりタイマーイベントでも止まりませんでした


タイマーが無効になっているとか、って事は無いですよね?
あと、間違いなくイベントハンドラを通ってますか?
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-10-07 16:25
引用:

KKKさんの書き込み (2005-10-07 16:09) より:
開始するときのイベントではデバッグできません。


開始する時はまだアタッチしていないので無理なんじゃないですか?

>またやはりタイマーイベントでも止まりませんでした
タイマーが動いているのは確実ですか?
どうやってそれを確認していますか?
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 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 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-10-07 21:17
.NETでサービスを作ったことは無いですけれど、参考までに

サービスのデバッグは面倒なので、可能な限りWindowsアプリケーションの状態でデバッグを行うようにしています。Windowsアプリケーションとサービスの差異は、UIが存在しない事と、実行時のユーザー権限が異なることです。その点を意識してテストしていれば、そうはまる事は無いと思います。

ネィテブC++でサービスを作っている時には、DebugBreak()API等でデバッガに落としていた記憶があります。でも流石に.NETでは機能しない予感。

.NETではDebugger.BreakやDebugger.Launchが上記APIに相当するみたいだけど、どんな動作をするかは、使ったことが無いので・・・。美味く出来たら教えてください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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
_________________
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-10-11 13:09
Tdnr_Symさん、こんにちは。

引用:

こういうサービスプログラムでは、Windowタイマーは用いません。
スリープ(Sleep)やウェイト(WaitFor...)を使って、スレッドを待機状態にします。


.Net では、Win32API を意識せずに、.Net Framework のライブラリ API だけを使用して Windows サービスを開発する事が可能です。
そして、時限発火装置としては、System.Timers.Timer というクラスがあり、IDE を使用すれば、まさにフォーム上にコントロールを配置するように Timer コンポーネントを使用できます。

↓参考までに。
チュートリアル : コンポーネント デザイナによる Windows サービス アプリケーションの作成
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-10-11 14:19
きくちゃんさん、こんにちは。

引用:

きくちゃんさんの書き込み (2005-10-11 13:09) より:
↓参考までに。
チュートリアル : コンポーネント デザイナによる Windows サービス アプリケーションの作成




下記↓の記述ですね。私はてっきりOnStartメソッドか何処かでループ処理用のスレッドを作成して、そのスレッド(サービススレッド)でポーリングなんかをするんだと思っていました。失礼いたしました…orz

引用:
OnStart メソッドは、サービスの操作が開始された直後にオペレーティング システムに戻る必要があります。永久的に続くループやブロックは実行できません。単純なポーリング機構を設定する場合は、System.Timers.Timer コンポーネントを使用できます。



あと、.NETには、3種類のTimerクラスがあるんですね〜
 ・System.Timers.Timer
 ・System.Windows.Forms.Timer
 ・System.Threading.Timer

私は「System.Windows.Forms.Timer」のようなタイマーしかないかと思っていました。勉強不足でした。orz。
KKK
大ベテラン
会議室デビュー日: 2003/10/10
投稿数: 119
投稿日時: 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イベントが発生していないようです。
(デバッグしてみましたが、止まりませんでした。
またイベントログにログを吐くようにしたのですが、何も出力されていませんでした)

スキルアップ/キャリアアップ(JOB@IT)