例えばこのようなコードがあったとします。
unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var SL: TStringList; begin SL.Clear; // エラーになる end;
end.
ボタンを押すと即 AV です。プロジェクトオプションで Map ファイルを出力するようにしておきます。Map ファイルは通常、EXE と同じフォルダに吐かれますので、ここに GetAVPos.exe をコピーします。GetAVPos が別フォルダにあってもいいのですが、Map ファイルを指定する必要が出てくるのでメンドイかと思います。大したファイルサイズでもないのでターゲットとなる EXE と同じフォルダ (*.map と同じフォルダ) にコピーして利用する事をオススメします。
ターゲットとなるアプリケーション (Project1.exe) を実行し、AV ダイアログが出たらここで Ctrl+C を押します。
直後に GetAVPos を起動すると、MapFile: と Address: が既に埋まっていると思います。 そして [Find] ボタンを押します。
すると素っ気無いですが、ユニットとユニットファイル名、エラー行が表示されます。
Line: 30 なのでちゃんとエラー行が特定されていますね (^-^)b
「ユニットとユニットファイル名は同じじゃないか?」と思われるかもしれませんが、例えば Unit1.pas の中で hoge.inc が使われている場合にはユニットは Unit1 となりファイルは hoge.inc となります。もちろんエラー行も hoge.inc での行番号となります。
また、理屈上 Map ファイルを出力した時点のソースコードを保存していないとエラー行は正しくレポートされませんので注意が必要です。
|