Releaseバージョンでcrashしたときの場所の特定方法です。minidumpファイルか、最悪落ちた場所のアドレス情報があることが条件です。画像はわざとcrashさせています。
- プロジェクトでマップファイルを作成する設定にしておく → プロジェクトのリンカ、デバッグ、マップファイルの作成ではいとする
- プロジェクトでcodファイルを作成する設定にしておく → プロジェクトのC/C++、出力ファイル、アセンブリの出力で、アセンブリ コード、コンピュータ語コード、ソース コード(/FAcs)を選択
- mapファイルから落ちた関数を特定
画像だと0x004180ff が落ちた箇所で、mapファイルで、落ちた箇所の範囲の関数を調べる。下のmapファイルの内容では、MsgLoop関数内と分かる。
0001:000170bd ?MsgLoop省略 004180bd f MainFrm.obj
0001:000171dd ?省略 004181dd f i MainFrm.obj - 落ちたオフセットを求める 〜 0x004180ffと0x004180bdからオフセットは0x42となる
- codファイルでMsgLoopのオフセット0x42を調べる
下のcodファイルで0x42からソースコードの行が特定できる。
; 5971 : *(int*)(0) = 100;
00042 c7 05 00 00 00
00 64 00 00 00 mov DWORD PTR ds:0, 100 ; 00000064H
Anciaでは落ちたときのGetExceptionInformation()情報とモジュール一覧、minidumpファイルを出力する予定です。minidumpファイルがあれば、スタックトレースが出るので、かなり状況が分かるはずです。