マイクロソフトのVisualC++で
テキストデータを処理するプログラミングしています。
(MFCは使っていません。)

使用してたプログラムの
一部の変数をクラス化しました。

数多くのエラーをかいくぐり、
Debugモードでは、
目的の演算を実行することができるようになりました。

ところが、
このプロジェクトをReleaseモードでビルド実行すると、

「trans1.exe の 0x0040d052 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x2eb11a94 に書き込み中にアクセス違反が発生しました。」

というエラーが出て止まってしまいます。

プロジェクトのプロパティ設定で、
ヒープ領域をDebugモードと
同じにしてみたりしたのですが、
状況は改善されません。

メモリの問題のような気がして、
配列の大きさ等をチェックしましたが、
問題なしでした。

プログラムを他の人が使えるように
するためには、
Releaseモードが必要なので困っています。

どなたか、アドバイスかご教示お願いします。
デバッグ方法を教えて頂いても大変助かります。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まずメモリ周りの不具合でしょうね。


Debug 版は各領域の配置間隔に余裕が有るので、少しはみ出した程度
なら平気で動きます。

テキストデータ処理で思い浮かぶチェック事項を挙げてみます。

・文字列は全て終端 '\0' で止めてあるか
 Debug 版は各領域の間に余裕が有る為、バッファ外で '\0' を拾って
 助かっている可能性が有ります。

・strcpy, strcat, sprintf
 上記またはこれらと同等のAPIで、受け側の大きさは足りているか
 (バッファサイズは問題無いとのことでしたが…)

・動的バッファのポインタや各種ハンドルを多重解放していないか
 free や close 系は NULL 以外で実行、実行したらポインタに NULL
 を代入、としておけば間違いは減りますね。

マルチスレッド環境なら
・共有領域に排他制御が施されているか
・スレッド間で処理順序に依存する部分は同期処理が施されているか
・strtok 等、そのままではマルチで使えない関数を使っていないか

先ずはこんな所かな…

必ず再現する障害のデバッグ方法として、Release 版で手軽なのは
トレースログですね。
適当な所に通過確認とバッファの内容確認を兼ねてログやメッセージ
ボックスを仕掛けます。
しかし、最初から全体に事細かにログを仕掛けると厳しいです。
コツは処理の中間地点に仕掛けて、それより前半か後半かを特定。
次はまた特定された側の中間にログを…、と段々と囲い込みます。

但し、ログを仕込んだ事で領域の配置が変わり、障害が発生しなく
なるという罠も希に有ります。心の片隅にでも留めておいて下さい。
    • good
    • 0
この回答へのお礼

ご教示ありがとうございます。

Debug版とRelease版で
そのような違いがあったとは知りませんでした。

ご指摘の点を中心に調べましたところ、
sscanf関数を実行するときに、
バッファが1文字分(NULL文字分)
足りなかったところが見つかり、
配列を大きくしたところ、
うまく解決できました。

本当に、本当に、助かりました。
どうもありがとうございました。

お礼日時:2003/09/12 13:38

Release版でデバッグかな?


Release版でもデバッグ情報をもたせることは可能です。
プロジェクトのオプションを変更してみてください。
方法はMSDNライブラリを見るとかいてあるはずです。

#1の方がかかれているように、デバッグビルドですとメモリの確保に余裕がありますが、Release版なら結構詰められますので再現できるかもしれません。

ただし、最適化をしてしまうとデバッグ情報は付加できないので、この方法にも限度はあります。

この回答への補足

ご教示ありがとうございます。
Release版でデバッグできるとは知りませんでした。

MSDNとGoogole等で「Release(版)」AND「デバッグ」で
検索してみたのですが、
Release版でデバッグする方法が分かりません。

プロジェクト/プロパティ/リンカ/デバッグ情報で
デバッグ情報を持たせるを「はい」等にしてみましたが、
ブレークポイントで止まってくれませんでした。。。。

大変恐れ入りますが、
参考URLを教えて頂ければ助かります。
よろしくお願いします。

補足日時:2003/09/12 13:30
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエラー発生アプリケーション mmc.exe

管理ツールのイベントログを見たり、保存したりすると、管理ツールが落ちてしまいます。
何とか、落ちながら保存された、イベントログには
「エラー発生アプリケーション mmc.exe、バージョン 5.1.2600.0、エラー発生モジュール mmcndmgr.dll、バージョン 5.1.2600.0、エラー発生アドレス 0x00054e27」
とあります。
何が壊れているんでしょうか。

Aベストアンサー

mmc.exeは管理ツール。mmcndmgr.dllはそのアイコン・ファイルのようですが。回答になっていませんね。
http://www.zdnet.co.jp/magazine/pcjapan/0009/sp4/08.html

参考URL:http://www.zdnet.co.jp/magazine/pcjapan/0009/sp4/08.html

QDebug.exe実行時にWinMainCRTStartup()でエラーが発生する

WindowsXP VisualC++.net2003 で開発をしています。
VC上で実行すると問題なく実行できるのですが、Debugファイルから実行するとエラーが発生します。

エラーの発生場所は
setSBUpLow() 行409+ 0x9となっています。
この関数はWinMainCRTStartup()で呼び出されています。この関数はAPIです。
Windowを初期化するときに自動的に呼ばれているようです。

自分のプログラムのどの部分でエラーが起こっているか調べたところ、クラスのコンストラクタ内で行っている次の処理が原因のようです。

 int **test;

 test= new int*[10];
 for(int i = 0; i < 10; i++){
  test[i] = new int[10];
 }

この部分をコメントアウトするとエラーが発生しなくなります。
new演算子でメモリを確保しているときにエラーが発生
しているようです。

なぜ、Debug.exeで実行したときだけ エラーがでるのでしょうか?
また、エラーが発生しないようにするにはどうすればいいのでしょうか?

WindowsXP VisualC++.net2003 で開発をしています。
VC上で実行すると問題なく実行できるのですが、Debugファイルから実行するとエラーが発生します。

エラーの発生場所は
setSBUpLow() 行409+ 0x9となっています。
この関数はWinMainCRTStartup()で呼び出されています。この関数はAPIです。
Windowを初期化するときに自動的に呼ばれているようです。

自分のプログラムのどの部分でエラーが起こっているか調べたところ、クラスのコンストラクタ内で行っている次の処理が原因のようです。

 int **te...続きを読む

Aベストアンサー

>Debug.exeで実行したときだけ エラーがでるのでしょうか?
Debug版とRelease版は別物だからです。

DebugでエラーがでるけどReleaseだとでなくなる。
逆にReleaseだと止まるけどDebugだと問題なく起動する。
VC++でプログラムしているとよくあることですが、私の経験的に
どこかであやまってポインタを参照しているケースがほとんどです。

class A;
class B;
例えばclass BのコンストラクタがクラスAのメモリを破壊している等。

どこを直せばいいかといっても作った本人が一番詳しいわけで
具体的にどこを直せばいいかは、恐らくソース全体をみないと分かりません。
問題のメモリがどのタイミングでどのメモリが書き換えられているか
や、エラーが発生したときthisポインタが
正しいアドレスかどうか、を先ず調べてください。
本当にわからない場合は、混合モードで追っていくものです。

Q"mmc.exe"ってどんな働きをするのでしょうか?エラーメッセージが表示されるのですが...

本日2度ほど"mmc.exe"のアプリケーションエラーが発生しました。
表示メッセージは次のようなものでした。
"0x77a5db1"の命令が"0x72392d74"のメモリを参照しましたが、メモリが"read"になることはできませんでした。
発生したのはACCESS2000でテキストファイル(6MB位の大きいもの)にリンクを貼ろうとした際、ACCESSの反応がなくなっため、強制終了してからです。
何らかの修復をしなければならない重要なメッセージなのかどうかわからず質問させていただきました。
mmc.exeで検索したところ、2件ほどヒットしましたが、今回の私の事象とは異なったため、質問しました。
よろしくお願いします。

Aベストアンサー

mmcはMicrosoft Management Consoleです。
MSの検索でMMCで検索すれば何個か文献が出るでしょう。
ヘルプ見ても出てくるはずです。
コントロールパネルの管理ツール内のアプレットはたいていMMCのコンソール
だったはず。

解決策はやはりとりあえずSP2当てて様子を見るというのは(Windows2000ならば)。

参考URLはSP2のダウンロードページです。

参考URL:http://www.microsoft.com/japan/windows2000/downloads/servicepacks/sp2/default.asp

QReleaseモードで実行すると出るエラー

現在Visual C++を用いてOpenGLを用いたプログラムを作成しています.
だいぶ苦労しましたが,ある程度できてきました.しかし,Debugモードで実行するとエラーは出ないのですが,Releaseモードで実行するとエラーが出てしまいます.
エラーの内容は以下のとおりです.
「0x0040530f でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000010 を読み込み中にアクセス違反が発生しました。」

エラーは_sftbuf.cの→のところで出るようなのですがこの原因はどのようなものが考えられるのでしょうか?

int __cdecl _stbuf (
FILE *str
)
{
REG1 FILE *stream;
int index;

_ASSERTE(str != NULL);

/* Init near stream pointer */
stream = str;

/* do nothing if not a tty device */
→ if (!_isatty(_fileno(stream)))
return(0);

/* Make sure stream is stdout/stderr and init _stdbuf index */
if (stream == stdout)
index = 0;
else if (stream == stderr)
index = 1;
else
return(0);

また,Releaseモードで作成したexeファイルをOpenGLのdllが入っていないPCで実行することはできないのでしょうか?
よろしくお願いします.

現在Visual C++を用いてOpenGLを用いたプログラムを作成しています.
だいぶ苦労しましたが,ある程度できてきました.しかし,Debugモードで実行するとエラーは出ないのですが,Releaseモードで実行するとエラーが出てしまいます.
エラーの内容は以下のとおりです.
「0x0040530f でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000010 を読み込み中にアクセス違反が発生しました。」

エラーは_sftbuf.cの→のところで出るようなのですがこの原因はどのようなものが考えられるのでしょ...続きを読む

Aベストアンサー

デバッグモードで発生しないがリリースモードでは発生するというのは、
変数の初期化忘れがあったりすると発生しやすいです。

読み込もうとしたアドレスが 0x00000010 ということですから、
ポインタ変数回りは大丈夫でしょうか? デバイスドライバでもなければ
こんな低い番地を読み書きすることはありません。

あと、OpenGLのルーチンの呼び出しをLoadLibraryとGetProcAddressを使って動的にアドレス取得して行っているのでなければ
DLLがない環境で起動しようとした時点で、該当DLLがない旨のエラーメッセージが出るはずです(Debugモードでビルドしても同じ)。

Qこのホ-ムペ-ジでの質問一覧画面がエラーで出ない

このホ-ムペ-ジですが
マイページ → 関心カテゴリーの質問一覧
を押してもエラ画面ーになり表示出てきません
自分の質問解答履歴は出ます
なぜエラーに ???
宜しくお願い致します

Aベストアンサー

エラーが続出していますね。
更新ボタンを押すと表示されることが多いです。

QDebug版とRelease版で結果が変わる

Visual Stadio 6.0 C++でDLLを作成した所、
Debug環境で行った結果とRelease環境で作成したDLLの実行結果が変わってしまいます。
この原因について何か思い当たる事がありましたら、教えて下さい。
宜しくお願いします。

Aベストアンサー

 こんばんは。

 まぁ、それが理由であるかは断言は出来ませんが、VC6には末恐ろしいバグもあるご様子で・・・。
 確かヘルプに、最適化をしておかしくなるケースと理由が記載されていた様な気がします。

 後、関数内にStatic変数宣言が置かれていると、最適化でインライン展開された時、展開された個数分のStatic変数領域が出来上がります(本当は一つの筈なのだが)。
 結果として、おかしくなります。
 「プロジェクトの設定 → C/C++ → 最適化 → 関数のインライン展開の制御」で「適合可能なもの全て」が選択されている時には要注意です。

 「VC6 最適化 バグ」
 http://www.google.co.jp/search?hl=ja&q=VC6%E3%80%80%E6%9C%80%E9%81%A9%E5%8C%96%E3%80%80%E3%83%90%E3%82%B0&lr=

 「VC6 サービスパック6」
 http://www.microsoft.com/downloads/details.aspx?familyid=A8494EDB-2E89-4676-A16A-5C5477CB9713&displaylang=ja

 こんばんは。

 まぁ、それが理由であるかは断言は出来ませんが、VC6には末恐ろしいバグもあるご様子で・・・。
 確かヘルプに、最適化をしておかしくなるケースと理由が記載されていた様な気がします。

 後、関数内にStatic変数宣言が置かれていると、最適化でインライン展開された時、展開された個数分のStatic変数領域が出来上がります(本当は一つの筈なのだが)。
 結果として、おかしくなります。
 「プロジェクトの設定 → C/C++ → 最適化 → 関数のインライン展開の制御」で「適合可能...続きを読む

Qホームページビルダー11で通信エラー(エラーコード:553)がサイト転送時に出ます。

 こんにちは。ホームページビルダー11でサイト転送すると通信エラ
ー(エラーコード:553)が出て、フレーム表示のページも表示され
ていない状態になってしまいます。どうしたらよいですか?

Aベストアンサー

こちらがご参考になるかと

V11 で転送時に「転送エラー」ダイアログが表示されます
http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

FTPのエラーメッセージの553ですと、「ファイル名の文法エラー、ファイル名が間違っているため実行できない」という意味ですので
この場合、大抵はファイル名に半角英数以外を使用しているのが原因トモ考えられますので、ご確認を。
ファイル名に使用できるのは半角英数と_-のみです。

ただ、どうもV11の不具合でもあるようですので、ファイル名に問題がない時は、サイト転送ではなくページ転送(FTP)や、フリーソフトのFFFTPなどを使って転送してみた後、ネット上で表示されるかどうか確認するのをおすすめします。

また、後日V11の修正ファイルがIBMで配布されると思いますので、たまに下記サイトをアクセスし、修正ファイルが公開されたらインストールされておかれてください。
http://www-06.ibm.com/jp/software/internet/hpb/

参考URL:http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

こちらがご参考になるかと

V11 で転送時に「転送エラー」ダイアログが表示されます
http://www-06.ibm.com/jp/domino01/swhc/esupport.nsf/key/49256A6A0001F136492572350006E350?opendocument

FTPのエラーメッセージの553ですと、「ファイル名の文法エラー、ファイル名が間違っているため実行できない」という意味ですので
この場合、大抵はファイル名に半角英数以外を使用しているのが原因トモ考えられますので、ご確認を。
ファイル名に使用できるのは半角英数と_-のみです。

ただ、どうもV11の不...続きを読む

Qdebug版とrelease版で結果が違う

現在c言語の勉強でシーザー暗号のプログラムを作っているんですが、鍵番号を入力するところで
while(1){
 printf("1から25までの鍵番号を入力して下さい : ");
 scanf("%d", &key);
 while((getchar()) != '\n');
   if(0 < key && key < 26){
     return key;
   }else{
     fprintf(stderr, "\a数字が正しくありません。\n");
   }
debug版では数字以外を入力されたらエラーが出るんですが、
release版ではそのまま進んでしまいます。これはどうしてでしょうか?

環境は win xp sp3 vc++2008EEです。

Aベストアンサー

たとえば, 「scanf の前でたまたま key の値が範囲内」だったとしたら, エラーが出なくても不思議じゃない. つまり, これでは正しくないということ.
デバッグ版だと実際に書いてあるプログラムのほかにもいろいろとやっているので, デバッグ版とリリース版では動作が違う可能性があります.

QWindows1032bitアップデート中にエラーが出ました。second-boot フェーズでエラ

Windows1032bitアップデート中にエラーが出ました。second-boot フェーズでエラーが出ました!全く意味がわかりません?

Aベストアンサー

windows10、windows10anniversary Updateに失敗をする場合は、
タスクトレイを開いてタブのスタートアップを開いて、すべてのアプリを無効にします。
次にもサービスを開いて、Microsoftの製品をすべて無効にします。

windows10 Creators Updateに失敗をする原因
http://freesoft.tvbok.com/win10/problems/trouble_shoot_list_creators_update.html

私のプロフィールにwindowsに関するURLを載せているので、必要な時にURLを開いて操作方法を確認してください。

QDebugやReleaseに関して

Visual C++ 2008 Express Editionを使用しているものです。

プログラムを実行する際に「デバック開始」と「デバックなしで開始」がありますが、
具体的にどのような違いがあるのでしょうか?
「デバッグとは、ソフトウェアにおけるプログラムのバグ(誤りや欠陥)を探して、正しく動作するように修正する作業のことである」というのは調べてわかったのですが、それでは「デバックなしで開始」というのはバグを探さず修正なしで実行するということでしょうか?
以前友人から「デバック開始の前にデバックなしで開始でまず実行したほうがよい」という意見を聞いたのですが、使い分けとしては友人の言っていることが正しいのでしょうか?
またReleaseというものもありますが、これはデバックなどとはどのように異なるのでしょうか?
またReleaseというのはデバックなどとはどのように使い分ければよいのでしょうか?

初歩的な質問ばかりで申し訳ありませんがどうかよろしくお願いします。

Aベストアンサー

デバッグで開始はあとでバグ探しがしやすいようにあまり極端な最適化を行わないで実行するものです。バグがあったときに場所が見つけやすくなっています。
デバッグなしで開始は最適化をして実行速度を稼ぐためのものです、バグったときに該当コードが最適化のためになくなっていることがあります。なのでデバッグがしにくいです。

リリースは普通、デバッグなしでコンパイルして実際に使ってもらう状態にした実行ファイルを作ることです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング