tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 を表示するような、コードを起こすような機会があったら、このスレの続きに投稿したいと思います。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。