• ベストアンサー

「読み込み違反」が起きたときのデバッグ方法

たとえば、Metasequoiaさんのページにありますように、読み込み違反が発生しプログラムが停止したとき「”main.exe”のアドレスXXXXXXでYYYYYYに対する読み込み違反が発生しました。」などどいうメッセージが出ることがあります。 http://www.metaseq.net/metaseq/bbs.html まれに、このアドレスをメモしておいて、報告してほしいという開発者さんを見かけます。例えば、上記Metasequoiaさんの場合もそうです。 例えば、VC++やBorland、GCCなどで開発している場合、このアドレスからいかにしてデバッグするのでしょうか?「私はこうしてる」などと言ったお話が聞ければと思い質問させていただきました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

そういう情報を元にしたデバッグにはデバッガを使います。 VC++とかの統合環境ならデバッガを内蔵してるし、gccを使ってるならgdbで。 「アドレスXXXXXXで」の方の値は、実行している命令のアドレスを示しています。これは、同じプログラムであれば、ユーザー環境でも開発環境でもどこで実行しても同じになります。 ですから、開発側でデバッガを使うことで「どの関数のどの文を実行している時にエラーが発生したのか」がわかります。 「YYYYYYに対する読み込み違反」の方の値はデータアドレスなのですが、こちらは実行条件によって値が変わってきます。そのため、ユーザーの環境をそのまま開発環境に再現することはできません。 ですが、「00000000」とか「FFFFFFFF」とかの特徴的な値が出てきたとしたら、そこからコード上の問題を追及できる可能性はあります。

atushi256
質問者

お礼

回答ありがとうございます。 >「アドレスXXXXXXで」の方の値は、実行している命令のアドレスを示しています。これは、同じプログラムであれば、ユーザー環境でも開発環境でもどこで実行しても同じになります。 >ですから、開発側でデバッガを使うことで「どの関数のどの文を実行している時にエラーが発生したのか」がわかります。 なるほど。アドレスは必ず一緒になるので、そこから絞り込むということですか。一点きになるのは、読み込み違反などの場合「エラー発生箇所とは別の箇所で変なことをしてしまって落ちる」ことが多いように思うのですが、このアドレス情報からだとピンポイントで絞れたりするものなのでしょうか?無いよりはまし、もしくは、エラー再現のために役立てるのでしょうか? >「00000000」とか「FFFFFFFF」とかの特徴的な値が出てき もし、何か例をご存知でしたら、教えていただけないでしょうか?

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

mapファイルなどを作成していると、どの辺りでエラーになったのか等の追跡が可能です。 MSのサイト。 http://support.microsoft.com/kb/196755/ja 「mapファイル デバッグ」での検索結果。 http://www.google.co.jp/search?hl=ja&q=map%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E3%83%87%E3%83%90%E3%83%83%E3%82%B0&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja 他に各DLL等がどこにロードされたか…という情報もあるといい感じです。 # VCで標準のままだとDLLファイル内に書かれるロードアドレスは同一になってしまいます。 # そのようなDLLを複数読み込んだ場合、アドレスがかぶってしまうのでOSが適切なアドレスに再配置してくれます。 # ということで、どこにロードされたのか…という情報もあるとよい…ということに。

atushi256
質問者

お礼

一度お礼を投稿したと思ったのですが、今見たら投稿されていなかったようで申し訳ありません。 URL先を見ますと、まさに私が知りたかった内容そのままの様ですね。非常に参考になりました。以外に複雑なというか、煩雑なことをしているのだなぁという印象です。統合開発環境ではこのあたりをボタン一つで調べられたりするものなのでしょうか。 何はともあれ、出発点には立てたように思います。どうもありがとうございました。

関連するQ&A