- PR -

サービスアプリケーションのデバッグ

投稿者投稿内容
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-07-25 09:51
引用:

Jittaさんの書き込み (2007-07-24 18:07) より:
Cっていります?

OnStartでテキトーにSleepしましょう。スルッと行っちゃってるから止まらないのです。



質問のところで挙げたURLにダミーサービスのことが載っていたので追加してみました。

sleepということですが、サービス開始までに一定時間を経過するとサービスは開始できないのではないでしょうか?(勘違いならご容赦ください)
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-07-25 09:57
引用:

MyHandleさんの書き込み (2007-07-25 09:51) より:
sleepということですが、サービス開始までに一定時間を経過するとサービスは開始できないのではないでしょうか?(勘違いならご容赦ください)


そのとおりです。デフォルトでは30秒ですが、レジストリの変更で任意の時間に設定できるので、10分くらいに増やしてしまえば問題ありません。下記の例では24時間に増やしていますね。
http://support.microsoft.com/kb/824344/ja
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-07-25 10:05
引用:

甕星さんの書き込み (2007-07-25 06:40) より:
1.デバッグ実行するのではなく、プロセスにデバッガをアタッチする手順がわからない
2.プロセスにアタッチしようとすると、エラーになる。(エラーメッセージくらい書いてほしい)
3.プロセスにアタッチしてブレークポイントを設置するのだけど機能しない。またはデバッガから停止できない。

どれでしょう?話の内容から察して、3.でしょうか?
リモートデバッガのインストールに失敗したときに、似たような状態になったことあります。再インストールしてなおりましたけど。




3です。サービスでないwindowsアプリケーションのようにブレークポイントまでの
実行順やそのときの変数の値を調べたいのですが、今現在できていません。
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-07-25 10:27
引用:

囚人さんの書き込み (2007-07-24 19:20) より:
AとBをデバッグしたいなら、CではなくAとBにアタッチしなければなりませんが、できませんか?
Bはサービスなのでできるとして、AはBがプロセスを作ってるのでできないという事でしょうか。だったらプロセスが起動するまで待って、それからアタッチすればよい事なのですが。




Cのサービスはとりあえずソリューションからはずしました。
プロセスが起動するまで待って・・ということですが、Bのプロセスが起動しないと
IDE(VisualStudio2005)からアタッチできないと思いますが私の思い違いでしょうか。
Bにアタッチした状態で、Aをデバッグ(ブレークポイントをつけるなど、実行時の変数
の値を調べる)することが今現在できていません。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-07-25 11:21
引用:

MyHandleさんの書き込み (2007-07-25 09:48) より:

Aのプロジェクトのほうで、Debug.Assert(false)を入れてみました。
サービス開始時に
トレースがダイアログで表示されたのですが、サービスのデバッグは通常この方法を
採るのでしょうか?


サービスに限らず、起動シーケンスを制御できない場面でのデバッグでは
常套的に使えます。

ちなみに、一度のアタッチでデバッグできるのはひとつのプロセスのみです。
ですので、AとBが別のプロセスで動いているのであれば、それぞれに
アタッチする必要があります。

なので、BにアタッチしていればAもデバッグできるということはありません。
#ただし、AがDLLの場合は別

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-07-25 12:50
引用:

プロセスが起動するまで待って・・ということですが、Bのプロセスが起動しないと
IDE(VisualStudio2005)からアタッチできないと思いますが私の思い違いでしょうか。


思い違いじゃないですよ。

AもBもデバッグしたいという事なんですよね?

Aは普通のアプリケーションでBはWindowsサービス。

Bはサービスとして登録して開始しておく。デバッガをBにアタッチ。OnStart メソッドをデバッグしたいなら、デバッガをアタッチする前に OnStart が終わらないように何かしておく(Sleep なり、Debug.Assert なり)。

BはAを起動する。Aが起動したらデバッガをアタッチ。以下同。

要は、デバッガをプロセスにアタッチしているつもりだけどできていない問題と、デバッガをプロセスにアタッチしているけど、アタッチした時には肝心のデバッグしたいメソッドが既に実行された後、という問題が混在しているという事かな?

_________________
囚人のジレンマな日々
MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-07-25 13:08
引用:

囚人さんの書き込み (2007-07-25 12:50) より:
BはAを起動する。Aが起動したらデバッガをアタッチ。以下同。

要は、デバッガをプロセスにアタッチしているつもりだけどできていない問題と、デバッガをプロセスにアタッチしているけど、アタッチした時には肝心のデバッグしたいメソッドが既に実行された後、という問題が混在しているという事かな?




BはAを呼んでいる(一番最初に実行するAのメソッドをcallしている)ので、BにアタッチしたらAがデバッグできると思っていたのがそもそもの間違い?
って事みたいですね。

Bのサービスを開始した後は
BのOnStartでSleepまたはassert、このときにAをアタッチ ということでしょうか?
BのOnStartでSleepまたはassertした状態で、AにIDEからアタッチできるのでしょうか?
sleepは試していませんが、Debug.Assertだとダイアログが表示されるのでIDEのメニュー(デバッグ-->プロセスのアタッチ)は使えないのでは?と思いますが、なにか私のやり方が違うのでしょうか?

・Aが単独でWINDOWSアプリケーションとして目的のとおり動くことを確認
・BサービスからAを呼ぶ(一番最初に実行するAのメソッドをcall)
・Aにアタッチ→デバッグ
この手順で進めるのが適切なのでしょうか?

MyHandle
常連さん
会議室デビュー日: 2007/04/15
投稿数: 39
投稿日時: 2007-07-25 15:22
引用:

とっちゃんさんの書き込み (2007-07-25 11:21) より:
なので、BにアタッチしていればAもデバッグできるということはありません。
#ただし、AがDLLの場合は別



・・混乱してきたような気がします・・
Aをdllにして、Bが参照するようにし、OnStartでAの一番最初に実行される
メソッドを呼んでみたのですが、
・ブレークポイントを設定しその部分で処理を一時ブレークする
・ブレークしたところの変数を調べる
は、やはりできません。なにか思い違いでしょうか?

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