タイトル : Re^3: VB6 に UnhandledException Event は無い? 投稿日 : 2014/06/29(Sun) 14:37 投稿者 : 茶々丸
返信、ありがとうございます。 「質問の仕方が悪くて、誰も返信してくれないのかな。」と不安に思ってました。 > コンパイルする際に、[ネイティブ コード コンパイル] と [シンボリック デバッグ情報を作成] を > 選択していますか? シンボル情報には、関数名、変数名、ソースコード上の位置情報などが含まれるため、 > これらを設定しておくと、exe からのデバッグがやりやすくなるかも知れません。 > > Visual Studio が導入されていない環境の場合は、ご存じのように > windbg を使うことができますね。 大体、こうのような手順でエラー箇所を特定すればいいんだと考えました。 (1) 開発環境で、コンパイルする時、[ネイティブ コード コンパイル] と [シンボリック デバッグ情報を作 成] を選択しコンパイル。 (2) 実行環境に windbg をインストール。 (3) 実行環境に *.exe と、 *.pdb をコピー。 (4) 実行環境でプログラムを実行する。 (5) エラーダイアログが表示される。 -> ここで、[OK]ボタンを押すと、どこでエラーが起きたのかわからない。 (6) windbg を起動し、プログラムのプロセスにデバッグ・アタッチ。 (7) windbg でコールスタックを表示する。 -> エラー箇所と、そのエラー箇所に至る関数を特定。 (8) windbg で、デバッグ・デタッチ (9) エラーダイアログの[OK]ボタンをクリックしプログラム終了。 > > 一応、自分で調べた結果、「UnhandledException に相当するものは無い」 > 無いですね。SetUnhandledExceptionFilter API で例外ハンドラを登録しておくことぐらいは > できるかも知れませんが、試したことはありません。 ありがございます。「魔界の仮面弁士」様からの返信なら絶対です。 実験結果で、ゼロ除算エラーなどのシステムエラーに相当する例外コードは、SetUnhandledExceptionFilter では、拾えないことが、わかっています。前回の投稿のあと、以下の実験が成功しました。 (1) APIフック(RaizeException 関数の実行コードの書き換えて、自前RaiseException 関数に飛ばす。) (2) SetUnhandledExceptionFilter を設定、RaizeException を例外コード 0x1 でコールし、 UnhandledExceptionFilter 内で、MiniDumpWriteDump により、ユーザーダンプファイル作成。 それぞれは、以下の問題を抱えています。 1番は、元のRaiseExceptionコードを呼び出す方法。 2番は、MiniDumpWriteDump は、EXCEPTION_POINTERS を必要とするので、SetUnhandledExceptionFilter の中でしか実行できない。なので、自前RaiseException関数の中では、MiniDumpWriteDump を実行できない。 それと、dbgHelp.dll に、StackWalk, SymLoadModule などの有用そうな関数があることに気づきました。 http://msdn.microsoft.com/ja-jp/library/cc428915.aspx ここらへんを利用したコードを書くと、実行時のエラー箇所を特定するスピードが上がりそうですが、そこは 時間がかかりそうなので、前述のデバッグ手法で当分、しのごうと思います。 ありがとうございました。 # StackTrace を表示するような、コードを起こすような機会があったら、このスレの続きに投稿したいと思います。 |