プロが教える店舗&オフィスのセキュリティ対策術

VC++でつくられたCOMをデバッガを使ってデバッグしたいのですが
どのようにすればいいのか、よい手段がわからず困っています。



いま担当しているプログラムの作りとしては、
2つの実行可能形式ファイル(AAA.exeとBBB.exe)があって、

AAA.exeは、
単独で動かした場合は自分のクラスをレジストリ登録/解除するプログラムで
それ以外にもいくつかの関数(後述のfunCCC関数やログ出力関数)を実装しています。

BBB.exeは、CoCreateInstance関数を使用してAAA.exe内のクラスのオブジェクトを作成して
その中で定義されている関数(funcCCC)にアクセスしています。


AAA.exeを実行してCOMがレジストリ登録されていることは
レジストリエディタで確認できていて、
また、BBB.exe内でCoCreateInstance関数が成功していることも、
funcCCCが実行されて正常で結果が戻ってきていることもプログラムの実行結果からわかります。


この状態で
BBB.exeからfuncCCCをコールしたときに
AAA.exeのfuncCCCにステップインしてデバッグしたいのですが
このようなことは、たとえばVisualStudio(2003)のデバッグ機能でできるのでしょうか。



デバッグしたい理由としては、AAA.exeの単体テストを行うためと、
あと、AAA.exe内のログ出力関数が
AAA.exeを単独で起動したとき、つまり
自分のクラスをレジストリ登録するときは正常にログ出力されているのですが
BBB.exeからfuncCCCを実行したときは、
funcCCC内で同じログ出力関数をコールしているのにログが出力されていないので
デバッガを使って内部でどういう状態になっているのかを確認したいのです。


ログが出力されないので
MessageBox関数を埋め込んでトレースや変数の内容を確認しているのですが
その結果ではAAA.exeを単独で実行したときと同じように
ログ出力関数がコールされているように見えます。

また
DebugBreak関数を使う方法というのを見かけたので
funcCCC内でDebugBreak()を実装してみたのですが
その場合は、DebugBreakのところでプログラム(BBB.exe)が終了してしまいます。


COMについて認識違いがあればご容赦下さい。
よろしくお願いいたします。

A 回答 (3件)

気になったので、VS2003にて、ATL-EXEタイプのCOMを作ってテストしたところうまくいきました。



AAA.exe が終了していることを確認。走っていればタスクマネージャで強制終了してください。

AAA.exe のfuncCCCにブレークポイントを張っておいて、デバッグ起動。タスクマネージャにて AAA.exe が走っていることを確認。

BBB.exe をデバッグ起動。BBB.exe から、funcCCC を呼び出すと、ブレークポイントで止まります。

AAA.exe をCOM経由で起動させずに、VS上から起動しておくのがポイントです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

この方法を試してみて、
BBB.exeからfuncCCCへ進んでいけることを確認しました。
COM経由でない方法でデバッグすればよかったんですね。
期待していたとおりの動きで、本当にありがとうございました。


あと、自分でも投稿後にいろいろ試していたところ、
オプションのデバッグの設定でRPCデバッグのところにチェックを入れると
この方法でもBBB.exeからfuncCCCへステップインできました。
補足ということで載せておきます。

お礼日時:2008/09/29 23:45

AAA.exeのプロジェクト(ソリューション)はあるのでしょうか?



AAAプロジェクトのプロパティまたは設定で
実行開始ファイルに BBB.EXEを設定
funcCCCの冒頭にブレークポイントを設定
F5でデバッグ実行

BBB.EXEの操作でfunCCCが呼ばれた時点でIDEがアクティブになると思います
AAA.EXEがデバッグビルドである前提ですが ・・・

この回答への補足

回答ありがとうございます。


AAA.exe、BBB.exeともにプロジェクトが存在していて
両方ともデバッグモードでビルドしています。
レジストリ登録するとき(AAA.exeを単独で起動するとき)も
デバッグビルドの資産で行っています。

ご回答いただいている方法を試してみたのですが、
funcCCCのところで止まることはなく
そのままプログラムが続行してしまいました。
funcCCC内の処理は正常に実行されているようです。
BBB.exe内のfuncCCCに入る直前にブレークポイントを張っても
ステップインできずに処理が続いてしまいます。

通常のDLLのデバッグだと
回答していただいた方法でデバッグできることを確認しているのですが
レジストリ登録されたものを呼び出す場合は
この方法以外に何か配慮が必要なのかと思っています。

補足日時:2008/09/25 13:23
    • good
    • 0

>AAA.exeを単独で起動したとき、つまり


>自分のクラスをレジストリ登録するときは正常にログ出力されているのですが
>BBB.exeからfuncCCCを実行したときは、
>funcCCC内で同じログ出力関数をコールしているのにログが出力されていないので

ログファイルは、誰が、どのタイミングでオープン、クローズしていますか?
前者と後者では「実行しているプロセス」が異なるので、ログファイルのアクセス権やオープンクローズのタイミングを考えねばなりません。

「ログファイルへのアクセス権がAAA.exeにしか無い」なら、後者の場合にはログは出力出来ません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ログファイルのオープン/クローズは
ログ出力関数内の出力する直前・直後で行っています。

ただ、オープン/クローズにエラー処理が入っていなくて
投稿後にエラーメッセージを取得する処理を入れて確認してみたところ
ログファイルのパスの指定がおかしくなっていました・・・

既存のプログラムに改修を入れているのですが
実行ドライブがCからDに変わったものの
ファイルパスはドライブ指定を省略していたために
単独で起動したときはDドライブ配下のパスに、
COMから呼び出したときはCドライブ配下のパスになっていたようです。

投稿する前に確認が足りなくて申し訳なかったです。

お礼日時:2008/09/25 13:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!