私のユーザーの1人が、私が分析したいと思ういくつかの稀なアクセス違反を報告しました。マップファイル内のAccessViolationのアドレスを解決する
私は正確にそのビルドのソースコードを持っているので、私はMAPファイルを作成することができました。しかし、私はMAPファイル内のAccessViolationによって提供されるアドレスを見つける方法を知らない。
(今後、JclDebugのようなフレームワークを使用して、使用可能なスタックトレースを作成したいと考えています)。
私はセットアップの例があります:アクセス違反がある
procedure CrashMe;
var
k: TMemo; a: TButton;
begin
k.Text := 'abc';
k.Color := clBlack;
k.Assign(a);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CrashMe;
end;
を:
アドレス004146CF。住所B2D88B53からの読書。マップファイルに
、私は以下の内容を見つける:00055498:MAPファイルには、0001を言いながら
Start Length Name Class
0001:00401000 000556A8H .text CODE
0002:00457000 00000770H .itext ICODE
0003:00458000 00001B0CH .data DATA
0004:0045A000 00004CCCH .bss BSS
0005:00000000 00000038H .tls TLS
....
0001:000552F0 Unit1..TForm1
0001:00055498 Unit1.CrashMe
0004:00004CC8 Unit1.Form1
0001:000554C8 Unit1.TForm1.Button1Click
はなぜAVは、アドレス004146CFと言っていますか?
CODEセグメント(0001)の開始アドレスを減算しても、私はまだ004146CF-00401000 = 136CFを取得しますが、これは私が探しているものではありません。
また、文字列 ":00414"を検索してエラーアドレスを見つけようとしましたが、何も見つかりませんでした。
MAPファイルのAVからアドレスを検索するにはどうすればよいですか?
質問に何が間違っているかを伝える。私は何時間もグーグルで行っており、これらのメモリアドレスの間で正しい変換技術を見つけられませんでした。 –
Jediコードライブラリでコードを検索できます。しかし実際にはマップファイルで提供されているアドレス範囲を走査しています。例外が発生した場所についてどのくらい正確に伝えることができるかは、マップファイル(行番号またはルーチンのみ)の中止によります... しかし、主にJvDebugHandlerを使用することができます。 –
アプリケーションにブレークポイントを設定し、ブレークポイントに達するまでotを実行します。次に、IDEで検索|エラーを見つけてアドレスを入力してください。 – MartynA