掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Access Violationが出ている場所の特定 (ID:38714)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
まず、プロジェクトオプションのリンカにある、マップファイルの項目で「詳細」を選択します。 この状態でコンパイルすると、<プロジェクト名>.mapというファイルができます。 これはテキストファイルで、メモ帳など開くと、その先頭が Start Length Name Class 0001:00401000 00247960H .text CODE 0002:00649000 00002174H .itext ICODE 0003:0064C000 00016C04H .data DATA 0004:00663000 000304A4H .bss BSS 0005:00000000 00000040H .tls TLS のようになっているので、1行目のStartのアドレス、00401000の部分をメモします。 (ほとんどこの数値だと思いますが、違う場合もあるかもしれません) で、エラーメッセージの"AccessViolation at address $AAAAAAAA"の $AAAAAAAAからメモした値(つまり00401000)を引きます。 たとえば、メッセージのアドレスが$0051A084だったら $0051A084 - $00401000 = $00119084 となります。 次に、マップファイルの Detailed map of segments 0001:00000000 00006C55 C=CODE S=.text G=(none) M=System ACBP=A9 0001:00006C58 00000105 C=CODE S=.text G=(none) M=SysInit ACBP=A9 0001:00006D60 00000145 C=CODE S=.text G=(none) M=Types ACBP=A9 0001:00006EA8 0000113C C=CODE S=.text G=(none) M=Windows ACBP=A9 0001:00007FE4 00000315 C=CODE S=.text G=(none) M=ActiveX ACBP=A9 ・ ・ ・ の部分から、この値(例では$00119084)が含まれるユニットを探します。 計算されたアドレスが$00006EA8から$00007FE4の間であれば、Windowsユニットと いうことになります。このリストはアドレス順なので、すぐに分かるでしょう。 で、ユニット名が分かったら、そのユニット名で検索するとマップファイルの終わりの方に Line numbers for <ユニット名>(<ユニット名>.pas) segment .text 52 0001:0024682C 53 0001:00246850 54 0001:0024685D 55 0001:0024686A 57 0001:0024687A 58 0001:0024689B 59 0001:002468A9 60 0001:002468C5 ・ ・ ・ という部分が見つかります。 ここで、また計算されたアドレスを探します。 ドンピシャの箇所があれば、その前に書かれた数値がソースの行数です。 ピッタリ一致しなくても、次の行のアドレスより小さければその行となります。 例えば、計算されたアドレスが$00246858だったら、上のリストでは00246850と 0024685Dの間なので、"53 0001:00246850"の部分が該当し、53行目という事になります。 もし、出てきたユニット名が自分で作ったものではない(SystemやWindows等の)場合は 標準の関数や手続きを呼び出すときに、メモリ領域確保や初期化をしてない等が考えられます。 自作のユニットの場合は、該当の行辺りで原因を探せるでしょう。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.