.mapと.codを利用したデバッグ

VC++でリリースとしてビルドした場合でアプリケーションエラーが発生すると、発生箇所の特定が難しい場合があります。
そういった場合を想定し、あらかじめ場所をある程度特定することの出来る方法があります。

  1. [プロジェクト]→[設定]→[C/C++]→[ファイルリスティング]を選択
  2. リスティングファイルタイプコンボボックスからマシン語コードとソースを含むを選択
  3. リスティングファイル名を必要であれば設定する。
    ただし、複数ソースファイルがある場合はリスティングファイル名は指定しないこと。
  4. [リンク]→[一般]を選択
  5. MAPファイルを生成するにチェックをつける
さて、.mapファイルですが、これは、関数の開始アドレスが記述されています。
リリースでビルドしたアプリケーションが、アプリケーションエラーを起こし、アドレスが表示されていたら、.mapファイルに記述された関数のアドレスと比較します。
一番近いアドレスの関数がエラーの発生箇所を含む可能性が出て来ます。

もう一つのファイル、.codはマシン語コードを出力してくれます。
.codの中を見ていくと、以下のような行が出て来ます。

00000 6a ff push -1 00002 68 00 00 00 00 push $L87001 00007 64 a1 00 00 00

左側の5桁の数字がコード先頭からのオフセットです。
その横の数字(6aやff,68など)はマシン語のコードです。
(で、どうやってソースと関連付ければよいのだろう・・・^^;)

参考資料

  • アプリケーションエラーとMapファイル
  • EnumWindows でのウィンドウ列挙(VC版)