VB6.0のexeでVC++6.0のdllをデバックするには

解決


わかりません  2009-09-15 00:33:41  No: 70909

VB6.0
VC++6.0
WindowsXP

VB6.0で作成したEXEを使って、VC++6.0で作成したdllをデバックしています。
exeは、デバックセッションの実行可能ファイルに設定しました。
また、exeとdllはdllのソースと同じフォルダに入れています。

dllを実行させると、exeは起動しますが、exeからdllを呼び出すと、
VC上のブレイクで止まりません。
どのように設定すれば止まるようになりますか。

教えてください。


仲澤@失業者  2009-09-15 04:08:18  No: 70910

>また、exeとdllはdllのソースと同じフォルダに入れています。

まず、DLLプロジェクトの「デバッグ構成」の「出力ディレクトリ」
(多分debug)に、VBのEXEをコピーして、それをデバッグセッション
の実行可能ファイルに登録しなおして、やり直してみてください。


わかりません  2009-09-15 19:25:29  No: 70911

仲澤@失業者様、回答ありがとうございます。

>まず、DLLプロジェクトの「デバッグ構成」の「出力ディレクトリ」
>(多分debug)に、VBのEXEをコピーして、
つまり、
[プロジェクトの設定]-[一般]タブ
出力ディレクトリ-出力ファイルのDebugとなっている箇所を
VBのEXEのパスに置き換えるという意味ですか?
その場合、ビルド時に「出力ディレクトリを作成できません」とエラーがでます。


仲澤@失業者  2009-09-15 20:49:15  No: 70912

>[プロジェクトの設定]-[一般]タブ
>出力ディレクトリ-出力ファイルのDebugとなっている箇所を
>VBのEXEのパスに置き換えるという意味ですか?

違います。何度書いても同じような内容になりますので、
理解してもらえるかどうか怪しくなってきましたが(vv;)、

VBで作った実行ファイル「?????.exe」をコピーして、
デバッグ対象としている「DLLのプロジェクト」の実行ファイル
が出力されるディレクトリの「中に」貼り付けてください。
その上で、「DLLプロジェクト」のデバッグセッションの実行
可能ファイルを、「今貼り付けた」「????.exe」に設定します。


わかりません  2009-09-15 21:41:55  No: 70913

仲澤@失業者様、回答ありがとうございます。

>VBで作った実行ファイル「?????.exe」をコピーして、
>デバッグ対象としている「DLLのプロジェクト」の実行ファイル
....
>可能ファイルを、「今貼り付けた」「????.exe」に設定します。
はい、その設定はもう行っています。

>>exeは、デバックセッションの実行可能ファイルに設定しました。
>>また、exeとdllはdllのソースと同じフォルダに入れています。
書き方が悪くて申し訳ありません。

他に何が足りないのでしょうか。
ご教授願います。


maru  2009-09-15 22:06:56  No: 70914

>>また、exeとdllはdllのソースと同じフォルダに入れています。
「ソースと同じフォルダ」ではなく、「debugフォルダ(DLLが作成されるフォルダ)」と言っているんですよ。
本当にそうなっていますか?


わかりません  2009-09-15 22:16:28  No: 70915

maruさん、回答ありがとうございます。
はい、同じです。
ソースと作成されるdllとexeは同じフォルダにあります。


maru  2009-09-15 23:19:44  No: 70916

> ソースと作成されるdllとexeは同じフォルダにあります。
デフォルトでは「ソースが置かれているフォルダ」と、「DLLが作成されるフォルダ」は別のはず。
プロジェクトフォルダ(ソースが有るフォルダ)が C\PROJECT ならDLLは C:\PROJECT\debug に作成されるはず。exeをこのC:\PROJECT\debugにいれたらってことをいっているんだけど。
出力フォルダを替えたってこと?

まあ、上記の対策をしてもうまくいかないのなら、ちょっと手間がかかるけど、呼び出される関数の頭に__debugbreak();を置くのも一つの手。これでデバッグ出来なければ、DLL側の関数は正しく呼び出せていないってこと。


わかりません  2009-09-16 01:19:28  No: 70917

maruさん、ありがとうございます。

>出力フォルダを替えたってこと?
はい、変えました。

>まあ、上記の対策をしてもうまくいかないのなら、ちょっと手間がかかるけど、呼び出される関数の頭に__debugbreak();を置くのも一つの手。これでデバッグ出来なければ、DLL側の関数は正しく呼び出せていないってこと。

上記に関して、詳しく教えてください。
__debugbreak()は、exeのVBのソース内でdllの関数を呼ぶ前におくってことですか。

それとも、dllの関数を
int A(int a);
とすると、ヘッダの宣言に
__debugbreak int A(int a);
と書くのか、
cpp内に、
__debugbreak int A(int a){
・・・
}
と書くのか、、
申し訳ありませんが、教えてください。


maru  2009-09-16 02:09:00  No: 70918

少しは調べる努力したら。検索すればすぐにでてくるよ。

int func() /* デバッグしたい関数 */
{
  __debugbreak(); /* DebugBreak();でも可 */

 .../* デバッグ対象のコード */
}


わかりません  2009-09-16 03:17:44  No: 70919

maruさん、お手数をおかけして申し訳ありませんでした。

DebugBreak();をdll内関数に入れてみました。
そして、exeを実行させると
「問題が発生したため、***.exeを終了します。ご不便をおかけして申し訳ありません。・・・」
とエラーメッセージが表示されます。

デバックボタンを押下すると、
「例外unknown software exception (0x80000003)・・・で発生しました」
と赤×エラーメッセージが表示され、OKボタンを押下すると
落ちました。

つまり、dllを正しく呼び出せていないと判断していいのでしょうか。


maru  2009-09-16 03:53:38  No: 70920

だ〜か〜ら〜  調べた?

MSDNより引用
「DebugBreak
現在のプロセスでブレークポイント例外を発生させます。その後、デバッガに信号を送り、何らかの処理を強制的に実行させることができます。プロセスがデバッグ中でないときは、標準例外ハンドラの検索ロジックが使われます。ほとんどの場合、未処理のブレークポイント命令のために呼び出し側プロセスは終了します。」

メッセージからするとDebugBreak()がちゃんと呼び出されている(DLLの関数を呼び出せている)みたいだけど。

VC起動中なら、制御がデバッガに移ってデバッグできるはず。
デバッグ出来ないとするとあなたのVCに環境に何らかの問題があるかもしれないね。これ以上はよくわからないなぁ。

まぁDebugBreak()でもデバッガに飛ばないとするとブレイクポイントを仕掛けても止まらないのはそんなに不思議でもないか。


dark  2009-09-16 17:51:45  No: 70921

デバックってなんぞ?


仲澤@失業者  2009-09-16 20:29:11  No: 70922

>「例外unknown software exception (0x80000003)・・・で発生しました」

は、別の問題っぽいですが、他に重要な点として

1.DLLの関数の修飾が
    extern "C" __declspec(dllexport) void __cdecl foo(){}  
  の様にになっていること
2.*.def ファイルを作成していて、かつ
  LIBRARY   MyDLL
     EXPORTS
        foo     @1
  の様にになっていること

等も確認しましょう。
もし、上記の文面が全く意味不明な場合は、
そうとう困難な状況にあるかもしれません。


YuO  2009-09-16 20:45:08  No: 70923

>     extern "C" __declspec(dllexport) void __cdecl foo(){}  
__cdeclではなく__stdcallでは?

MSKB: [VB5] Visual Basic 5.0 から呼び出し可能な DLL の作成例
http://support.microsoft.com/kb/410837/ja
でもすべて__stdcallですし。


maru  2009-09-16 20:52:47  No: 70924

> は、別の問題っぽいですが、他に重要な点として
いやいや、
>>「例外unknown software exception (0x80000003)・・・で発生しました」
はint 3割り込みが発生したことを示しますからDebugBreak()が正しく呼び出され、
> ほとんどの場合、未処理のブレークポイント命令のために呼び出し側プロセスは終了します。」
の状態になっていることを示します。したがって、関数名の問題はクリアしているものと推察されます。

問題はデバッガに制御が移らないことです。
int 3 例外ハンドラが正しく設定されていない?
わかりません さんに確認しますが、普通のVCアプリはデバッグ出来るんですよね。


ryo  2009-09-16 21:44:41  No: 70925

ためしに
テスト用のexeをVCでつくってみて
exeからデバッグしてみてはどうかな?

直接の解決にはならんが、問題の洗い出しにはなると思う


仲澤@失業者  2009-09-17 00:46:30  No: 70926

>__cdeclではなく__stdcallでは?

おっと、VBからでしたね。YuOさんおっしゃる通りです。
引数が2こ以上あると動かなくなっちゃいますねぇ(vv;)。


maru  2009-09-18 02:31:50  No: 70927

> 引数が2こ以上あると動かなくなっちゃいますねぇ(vv;)。
確かスタックの巻き戻しが呼び出し元か呼び出し先かの違いがあるので、
引数が1つでもあったら動かないような気が...


わかりません  2009-09-18 23:40:07  No: 70928

皆様ご教授ありがとうございます。
書込みが遅くなってしまって申し訳ありません。
残念ながら、何が悪いのかわからないままです。
ファイルに変数の値等を書き込ませながら、デバックを行うことは
できますので、現在はそれでデバックを行っています。

また何か新しい情報が入りました際には、書き込ませていただきます。
ありがとうございました。


dark  2009-09-19 00:37:48  No: 70929

デバックってなんぞ?
      ~~


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加