フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1] 2
トピック: [Software] GetAVPos
DEKO
管理者
投稿数: 2690
[Software] GetAVPos
on: 2015/01/21 09:04 Wed

現在ではイロイロなデバッグツールがありますので今更感は拭えませんが、以前作った AV アドレスからソースコードのエラー位置を特定するツールです。

# Map ファイルを出力しておく必要があります。

Download: https://ht-deko.com/software/getavpos_170.zip

[Tips]
・Map ファイルのある場所に置いておくと MapFile は自動的に埋まります。
・AV ダイアログを Ctrl+C してクリップボードに入れた状態で起動すると Address が自動的に埋まる事があります。

[利用規定]
このツールはハラヘッタウェアです。
https://ht-deko.com/delphiforum/harahettaware/

See Also:
[マップ デバッグ ファイル(*.map)]
http://docwiki.embarcadero.com/RADStudio/XE7/ja/%E3%83%9E%E3%83%83%E3%83%97_%E3%83%87%E3%83%90%E3%83%83%E3%82%B0_%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB

DEKO
管理者
投稿数: 2690
Re: [Software] GetAVPos
on: 2015/01/21 14:52 Wed

AV のダイアログで Ctrl+C すると、

---------------------------
Getavpos
---------------------------
モジュール 'GetAVPos.exe' のアドレス 005E8045 でアドレス CD7060FC に対する読み取り違反がおきました。.
---------------------------
OK
---------------------------

 
こんな文字列がクリップボードに入りますが、これがクリップボードに入っている状態で GetAVPos を起動すると ”005E8045” が自動的に抜き出されて Address: 欄に入ります。

ただ、エラーメッセージを決めうちで抜き出しているので、アドレスを抜き出せない事があります。

DEKO
管理者
投稿数: 2690
Re: [Software] GetAVPos
on: 2015/01/21 15:09 Wed

Map ファイルを出力するには、プロジェクトオプションで [Delphi コンパイラ | リンク] の "マップ ファイル" を "詳細" に設定します。

DEKO
管理者
投稿数: 2690
Re: [Software] GetAVPos
on: 2015/01/21 15:25 Wed

例えばこのようなコードがあったとします。

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 ファイルを出力した時点のソースコードを保存していないとエラー行は正しくレポートされませんので注意が必要です。

DEKO
管理者
投稿数: 2690
GetAVPos ver1.20 リリース
on: 2015/01/21 18:56 Wed

[変更点]

  • カスタムアプリケーションマニフェストを加えた。
  • OpenDialog にフィルターを設定した。
  • UI の変更
DEKO
管理者
投稿数: 2690
GetAVPos ver1.40 リリース
on: 2015/01/22 02:09 Thu

[変更点]

  • 英語の AV ダイアログに対応した。
  • UI の調整
  • 内部ロジックの変更
---------------------------
Project1
---------------------------
Access violation at address 005B14D1 in module 'Project1.exe'. Read of address CD7060FC.
---------------------------
OK
---------------------------

 
このような英語の AV ダイアログにも対応しました。

DEKO
管理者
投稿数: 2690
エラーメッセージ
on: 2015/01/22 02:15 Thu

GetAVPos が吐くエラーメッセージには以下のようなものがあります。

Can not analize Base-Address.
ベースアドレスが取得できません。
Delphi が吐いた Map ファイルである限り、このエラーが出る事はないと思います。

Can not analize AV-Address.
AV の発生したアドレスが Map ファイルに存在しません。
入力した AV アドレスが間違っている可能性があります。

LineNumber not found.
ソースコードのエラー行を特定できません。
エラーを出した EXE と Map ファイルが異なるものである可能性があります。

# Map ファイルが正常なのに上記エラーが出るようでしたらご連絡ください。

DEKO
管理者
投稿数: 2690
C++Builder の Map ファイルは?
on: 2015/01/22 08:44 Thu

言われる前に言っておきますが、C++Builder が吐いた Map ファイルには対応していませんし、対応する予定もありません。

実際に C++Builder で Map ファイルを書き出してみれば解るのですが、C++Builder の Map ファイルからは Delphi の時のように詳細な情報は取得できませんし、ソースコードの位置も取得できません (多分)。

DEKO
管理者
投稿数: 2690
GetAVPos ver1.50 リリース
on: 2015/01/22 20:21 Thu

[変更点]

  • エラーをメッセージダイアログで表示するようにした。
DEKO
管理者
投稿数: 2690
GetAVPos ver1.60 リリース
on: 2015/01/23 21:13 Fri

[変更点]

  • 起動時に検出した Map ファイルをフルパスで表示するようにした。
  • Explorer からの Map ファイル D&D に対応。
  • 二重起動防止ロジックを組み込んだ。
ページ: [1] 2
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.04 sec.