- ベストアンサー
VC++で作成したDLLのデバッグ
VC++6.0で作成したDLLファイルのデバッグ作業でVBでコンパイルした EXEファイルを使うと、例外エラーが発生してしまいます。 EXEファイルにデバッグ情報が書き込まれるのでしょうか? 次からそのEXEファイルを利用すると、やはり例外エラーがおきます。 (それに長い間気づかず、ずっとバグ探しをしてました。) VC++のDLLファイルのデバッグモードはVBのEXEファイルでは利用できないのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
お書きになった内容だけでは現象がよくわかりませんが、そのようなケースでEXEファイルに何か書き込まれることはありません。 >VC++のDLLファイルのデバッグモードはVBのEXEファイルでは利用できないのでしょうか? そんなことはないはずです。 どこで例外エラーが出ているのか調べましたか? おそらくDLLの内部で例外が出ているのだと思いますから、段階を追って調べた方がいいと思います。 DLLが正しくロードされているか確認しましたか?あるいは、EXEで呼び出しているそのDLLのエクスポート関数のプロトタイプが違うということはありませんか?同じ名前のDLLでバージョンが異なるものが他のフォルダに存在するというようなことはありませんか? DLLのプロジェクトの「デバッグセッションの実行可能ファイル」にそのVBで作ったEXEファイルを指定してデバッグをしたのですよね?念のためDLLと同じ場所にEXEファイルを置いておくほうがいいかもしれません。 (同じ名前のDLLがシステムフォルダ等にあるとそちらが優先的にロードされてしまう可能性がある)
その他の回答 (3)
- tomokopg
- ベストアンサー率33% (7/21)
mnabeさんもおっしゃってますけれども、「マルチスレッドのプログラムにブレークポイントはってテスト」というところにまず無理があると思います。 ログをはくなどして、スレッドの制御があなたの想定通り行われているかどうかチェックする必要があるでしょう。その結果をデバッグビルドとリリースビルドと照らし合わせてみたらいかがですか。
お礼
ご回答してくださった皆様。ありがとうございました。 何が原因だったかはいまだ不明なのですが、 マルチスレッドでブレークポイントをはると 私の意図していない処理がおきるようです。 本件とは関係ないですが、デバッグとリリースでは使用する ランタイムライブラリが異なるため、それにより発生するエラーもあるそうです。
- mnabe
- ベストアンサー率33% (427/1283)
っで呼出の方法は? その呼び出した時のオブジェクトの生きている最中に、DLLは終了できているのですか? 話を聞いていると、マルチスレッドの様ですので、その場合には、オブジェクトの生きている最中に終わらない事がよくあります。特に、デバッグ環境では、スレッドの制御が少しでもミスっていると、よく意味不明なエラーが発生します。 特に、ブレークポイントを張っていると顕著にでます。 そういう時には、動作LOGを生成する等の方法でデバッグするとよいでしょう。
お礼
ご回答ありがとうございます。あれから重ねてテストをしてみました。 呼び出しはVB側でDeclare宣言をして呼び出しています。 ブレークポイントでどれかスレッドをとめた場合、他のスレッドは どういう状態なのでしょうか? 基本的にとまっているようなのですが、 あるスレッドはWaitForMultipleObjectsでCreateEventで つくったイベントがシグナル状態になるまで待機 しているのですが、そのイベントがシグナル状態になった瞬間に アセンブラモードの中であるメモリアドレスを参照しようとし例外エラー でとまってしまいます。 よってハンドルやスレッドは解放されず、正常終了できません。 DLL自体のソースは全て自分で書いたわけではなく、もともとあったものを 私が修正追加を行いまして3つスレッドが同時に動いている感じです。 いろいろなポイントでエラーログを作っていくのは効果的かと思いますが ステップ数が10000ほどあり、なかなか効率的にはいかないのが現状です。 しかし何故かリリース版のDLLを使うと問題なく動作するという具合です。 そのDLLは特に特殊なライブラリなどは使用せず、MFCもつかっていません。 VCのデバッグモードで正常に実行できない、リリース版だと実行できることから VBのEXEファイルではデバッグモードで実行できないのではと勘違いしてしまいました。
- mnabe
- ベストアンサー率33% (427/1283)
貴方の提示して条件では、以下の答えになります。 『利用出来ます。』 次の情報が最低は必要です。 VBのバージョンは(多分6.0でしょう) 例外エラーとはどんなエラーなの? エラーメッセージをなるべく正確 例外エラーは、DLLの呼出前なの後なの? 開発環境のOSは? DLL のリリースでも同様の現象なの? VBのプログラム以外からは? エラーの後、どうなりますか? VCが終了してしまう(要するに、DLLのエラーではなく、VCがエラーを掃出している) DLL の実行が出来ないだけ DLL のステップ実行ではどうなります? DLL ってどんな作り?? VBから呼べる様に作ったの? それとも、COM なの? それとも、ActiveX.DLL なの? VBからはどんな呼出方法なの? DLLの宣言部分は大丈夫? 位の情報は提示して欲しいですし、確認を行って欲しいですね。まぁこれだけ全部確認とれば、大抵原因にたどり着くのですがね。
補足
正確にはVisual Basic6.0SP3 とVisual C++6.0SP3 OSはWindows2000 SP3です。 音声関係のプログラムでして詳しいことは申し上げられないのですが DLLファイルはマルチスレッドで動いています。 >VBのプログラム以外からは? これはたしかめいません。DLLが音声データを必要するため > DLL のステップ実行ではどうなります? アセンブラモードの中でとまります。 > DLL ってどんな作り?? VBからは呼べます。実際リリース版では正常に動作します。 _stdcallとdef定義で作成しています。 >VBからはどんな呼出方法なの? 必要なパラメータは音声データのポインタと、その他音声データのパラメータです。 >DLLの宣言部分は大丈夫? デバッグモード以外は正確に動くので大丈夫かとおもいます。
お礼
ご回答ありがとうございます。 もちろんブレークポイントをはりまくってテストを行いました。 例外エラーがでるポイントですが、 ブレークポイントをおってしらべていっていますが、 一定の場所ではありません。基本的にはポインタでありえない メモリアドレスを参照しようとしているのです。 WaitForMultipleObjectsでとめているスレッドがあるのですが そこでwaitがとけた後にエラーがおきる確立が40%ほどです。 しかしなぜかリリースでコンパイルしたDLLファイルだと正しく動作するのです。 コンパイルの際にEXEファイルの場所にコピーする設定になっています。 またSystemフォルダにはおいていません。 でそのときにEXEファイルをVB側で再コンパイルしないとエラーがおきるのです。 とりあえずVBのEXEでも問題ないことですので もうちょっと調べてみたいと思います。