• ベストアンサー

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

たとえば、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% (2177/4070)
回答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

  • metasequoiaでプラグインができない

    使用ツール:metasequoia ver2.4.10 こんばんは。 metasequoiaでプラグインをしようとしたところ ”アドレスxxxxxxでxxxxxxの読み込み違反が起こりました。” と表示されプラグインができません。 一体何が原因でどのような対処をすればプラグインすることができるのでしょうか? よろしくお願い致します。

  • デバッグ中にアドレスエラーが発生してプログラムが途中で止まってしまいま

    デバッグ中にアドレスエラーが発生してプログラムが途中で止まってしまいました。違うアドレスにアクセスしているのが原因だと思うのですが、このような場合は具体的にどのようなことをすれば解決できるのでしょうか? 知識が浅く初歩的な質問かもしれませんが、よろしくお願いします。 開発環境はHEWを使用しています。

  • チーム開発のデバッグ方法について

    複数人数で開発を行っている場合なんですが、 デバッグの時期に諸々発生したバグレポートは、 どのように管理しているのでしょうか。 現在、管理に苦労しております。 特に、スタッフそれぞれが違うオフィスで開発して いる場合などで、相当量発生しているバグを誰が、 どう管理するかなんです。 難儀な物で、クライアント毎にバラバラで、 メールで直接書いてあったり、口頭での連絡、 ネットワークでエクセルデータの共有をしている 場合もありますが、書き込み禁止だったり、重複 してしまったり。紙資料の場合もあります。 また、情報共有の掲示板を用意しているところも ありますが、無視して直電を入れてくる人も居ます。 みなさんの所では、どうされているのでしょう。 また、アイデアなどありましたら教えてください。 あと、ちょっと気になったのですが、バグのレポート をみなさんは、どう呼称していますか? バグレポートとか、デバッグシートなど割合聞きますが、 一般的な通称ってありますか?

  • gdbデバッグのためのmakefile作成

    現在Ubuntu Linuxでgccプログラミングを行っています。現在、ソースコードをいくつかのファイルに分割して作成しています。コンパイル時はmakefileを使用してmakeして実行ファイルを作成しています。 現在のプログラムをgdbでデバッグできるようにしたいと思っているのですが、 その場合のmakefileはどのようにして書けば良いのかをご教示頂きますよう、お願い致します。 現在のmakefile内容 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2319/trunk/20140411/Makefile #test #CC = gcc #test:main.c event.c exe: main.o event.o env.o audio.o task.o comm.o menu_show_status.o gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o -lpthread main.o:main.c gcc -c main.c event.o:event.c gcc -c event.c env.o:env.c gcc -c env.c audio.o:audio.c gcc -c audio.c task.o:task.c gcc -c task.c comm.o:comm.c gcc -c comm.c menu_show_status.o:menu_show_status.c gcc -c menu_show_status.c

  • jsp、servletのリモートデバッグについて

    eclipseを利用し、jsp、servletで開発を行おうとしているのですが、 リモートデバッグの方法が分かりません。 以前、開発環境と、実行環境が同じ環境下においてのリモートデバッグは 行ったことがあるのですが、今回は環境が別々になっています。 このような場合はどのような設定を行えばよいのでしょうか。 なおサーバー側の「catalina.bat」に以下の行を追加しています。 set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 【実行環境】 CentOS5 tomcat6 apache2.2 【開発環境】 WindowsXp Eclipse 宜しくお願いいたします。

  • windowsプログラムのデバッグ

     最近VCでwin32API Applicationを作り始めたのですが イベントに対する挙動をチェックしたいのですが方法がわかりません。  今まではConsoleプログラムだけなのでプログラムが動かなかった場合、どこまで動いているのかprintfで チェックしていたのですがwindowsプログラムの場合どうすればそのような動作チェックができるのでしょうか。  プログラム自体はwaveIn、waveOut系を使った録音・再生するだけのプログラムです。 具体的なバグは録音終了を表すMM_WIM_DATAメッセージが 送られてきた場合に再生ボタンを使用可したいのですが 設定した録音時間の3秒をすぎても使用可能になりません。 デバッグ方法がわかればMM_WIM_DATAが本当に行われているのか、 行われていた場合どこでとまっているのか、がわかると思うので教えて頂きたいです。 【開発環境】 環境:VC++6.0ProffessionalEditon OS:Windows2000 【その他】 C言語の知識は入門書を一通り理解できる程度。 リソースファイルは使用しておりません。

  • printf()関数の括弧を二重にして、printf((~~~))とし

    printf()関数の括弧を二重にして、printf((~~~))として コンパイル/実行すると、実行時セグメンテーション違反が発生します。 コンパイル時には警告も発生しますが、このセグメンテーション違反が なぜ起こるのか理由がよくわかりません。ご回答いただけるとありがたいです。 以下、サンプルコードと実行例です。よろしくお願いいたします。 ---mytest.c---- 1 #include <stdio.h> 2 3 int main(void){ 4 5 //printf("test:%d", 1)ではもちろんコンパイル/実行に成功する。 6 printf(("test:%d", 1)); 7 return 0; 8 } 【コンパイル/実行結果/gccバージョン】 #gcc main.c main.c:6:警告:passing argument 1 of printf makes pointer from integer without a cast #./a.out セグメンテーション違反です # gcc --version gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) ・ ・

  • 読み込み中にアクセス違反が発生しました、と出ます。これを回避することは

    読み込み中にアクセス違反が発生しました、と出ます。これを回避することはできますか? C++でプログラミングをしています。 現在、ポインタ(p)に入れたアドレスをずらしていって、メモリの任意の位置の値を表示する、というプログラムを制作しています。 具体的に言うと、上記のプログラムではない別のプログラムを実行し、そのプログラムで宣言した変数のアドレスを表示させます。そしてそのプログラムが動いている最中に、上記のプログラムを起動させ、ポインタpにその変数のアドレスを代入して、表示させようとしました。 しかし、止まってしまいます。デバッグしてみると、「test.exe の 0x00024ad5 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x0014fde8 を読み込み中にアクセス違反が発生しました」と出ます。 なんとかこれを回避して、ポインタに代入したアドレスを表示さすことはできませんか? 宜しくお願いします。 ちなみに、自分がかなり妙なことをしているのは自覚しているつもりです。

  • C#:VS2008について

    現在VS2008C#で開発を行っています。 そこで、デバッグで実行するとSaveFileDialogの表示時に下記のエラーが発生しています。 "OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。Main 関数に STAThreadAttribute が設定されていることを確認してください。 この例外はデバッガがプロセスにアタッチされている場合にのみ発生します。" しかし、EXEで実行した場合上記エラーが発生せず、正常にSaveFileDialogが表示されます。 そこで質問なのですが、デバッグで実行した場合と、EXEで実行した場合では何か違いがあるのでしょうか?また、なぜ上記エラーはデバッグ実行時のみ発生しているのでしょうか?回答よろしくお願い致します。

  • VB6からVC6で作成したDLLの関数を呼び出すときに注意すること

    VB6からVC6で作成したDLLの関数を呼び出すときに、型について気をつけないといけませんが、VB6でint型のものはVC6ではshortにしないといけないのでしょうか?マシンやOSや開発環境(例えばVS2005やGCC)により違ってくるのでしょうか? VB6とVC6でやり取りする場合の型について知りたいです。 あと、ActiveXのDLLの場合は関数にアクセスするのではなく、COM(という概念がわかっていないのですが)を使うのですか?

専門家に質問してみよう