読み取りエラーについて


ガオー  2024-08-28 18:50:15  No: 151594

こんばんは。

開発環境で実行してもエラーは発生しないのですが
運用環境では以下のエラーが発生します。
「モジュール '***.exe' のアドレス00601BB1 でアドレス 000003C4 に対する読み取り違反がおきました」
なにが原因なのでしょうか。

IDEはDelphi 10.1 Belrin update2 です。


HFUKUSHI  2024-08-28 20:49:55  No: 151595

このような場合は、まずは詳細マップからエラーを起こしたソースコードの位置を特定する、ということになるかと思います。
- プロジェクトオプションのリンクのマップファイルを詳細にしてコンパイルして、mapファイルを生成します。
- mapファイルの先頭のNameが.textの行のStartのアドレス(通常00401000)を確認しておきます。
- エラーが発生したアドレス(この場合00601BB1)から.textの開始アドレスを引きます(16進です)(この場合00200BB1)。
- mapファイルのDetailed map of segmentsの中から0001:<そのアドレス>(この場合0001:00200BB1)よりも小さく、最も近い行を探し、右側のM=のところのユニット名を確認します。
- さらにmapファイルのPublics by Valueのなかから0001:<そのアドレス>(この場合0001:00200BB1)に最も近い行を探します。これで関数名がわかります。
- さらにmapファイルのLine numbers for <クラス名(ユニット名)> segment .textで0001:<そのアドレス>を探します。このアドレスの直前の数字がそのユニット上の行番号になります。
なおデバッグ情報がないと詳細な情報が出ないので、できればデバッグビルドにして、デバッグ版DCUを使用するようにしてコンパイルしなおした実行ファイルとmapファイルの組み合わせで試したほうがいいとは思います。

またもっと詳細にエラーが起きた状況を知りたい場合はJCL Debug Expertなどを使用する方法もあります。

Owl's perspective: JCLでお手軽に例外発生時のスタックトレースを取る
http://owlsperspective.blogspot.com/2017/12/get-stacktrace-by-jcldebug.html

参考にしてください。


ガオー  2024-08-29 16:52:23  No: 151596

HFUKUSHIさんお返事ありがとうございます。
開発環境ではエラーが発生しません。
ですのでHFUKUSHIさんがおっしゃるエラー箇所を特定することが出来ないのではないでしょうか


HFUKUSHI  2024-08-29 17:22:14  No: 151597

いえ、実行環境でも詳細マップがあれば
> 「モジュール '***.exe' のアドレス00601BB1 でアドレス 000003C4 に対する読み取り違反がおきました」
のメッセージから例外送出の位置を知ることができます


igy  2024-08-29 17:24:35  No: 151598

> 運用環境では以下のエラーが発生します。 

とのことですが、特定の1か所のみ、起きていますか?
それても、Delphiがインストールしていない パソコンすべてで起きていますか?


ガオー  2024-08-29 18:01:38  No: 151599

Delphiがインストールされていないパソコンでエラーが発生しています。


igy  2024-08-29 18:08:19  No: 151600

> Delphiがインストールされていないパソコンでエラーが発生しています。

手元にDelphiがインストールされていないパソコンがあれば、それで実行してみて、
ソースコード上のエラーになる場所を特定すれば、後は、原因を調べて修正すれば良さそうですね。


ガオー  2024-08-29 18:39:03  No: 151601

承知しました。
来週出張に行き現地で調査をして
改めて状況をご連絡させていただきます。
ありがとうございました。


HFUKUSHI  2024-08-30 11:41:55  No: 151602

蛇足ですが
- コードを変更するとmapファイルの内容も変わるので、あらかじめexeとmapが一致した状態を用意しておく(詳細マップ、デバッグ版DCUを有効に)
- mapファイルからは例外送出の位置しかわからないので、RTL/VCL内でエラーが起きている場合は原因を推定するしかない
- そのような状況に備えて、JCL Debug ExpertやmadExcept https://www.madshi.net/ 、Eurekalog https://www.eurekalog.com/ などを仕込んだデバッグ用のexeを用意して、事前にエラーを仕込んで例外を発生させ、どのように対応すればいいか確認しておくといい


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加