• ベストアンサー

VC++でDeugモードOKで、Releaseモードのみでエラーが出る?

マイクロソフトのVisualC++で テキストデータを処理するプログラミングしています。 (MFCは使っていません。) 使用してたプログラムの 一部の変数をクラス化しました。 数多くのエラーをかいくぐり、 Debugモードでは、 目的の演算を実行することができるようになりました。 ところが、 このプロジェクトをReleaseモードでビルド実行すると、 「trans1.exe の 0x0040d052 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x2eb11a94 に書き込み中にアクセス違反が発生しました。」 というエラーが出て止まってしまいます。 プロジェクトのプロパティ設定で、 ヒープ領域をDebugモードと 同じにしてみたりしたのですが、 状況は改善されません。 メモリの問題のような気がして、 配列の大きさ等をチェックしましたが、 問題なしでした。 プログラムを他の人が使えるように するためには、 Releaseモードが必要なので困っています。 どなたか、アドバイスかご教示お願いします。 デバッグ方法を教えて頂いても大変助かります。 よろしくお願いします。

  • zico2
  • お礼率79% (27/34)

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

  • ベストアンサー
  • BILLY-J
  • ベストアンサー率57% (60/105)
回答No.1

まずメモリ周りの不具合でしょうね。 Debug 版は各領域の配置間隔に余裕が有るので、少しはみ出した程度 なら平気で動きます。 テキストデータ処理で思い浮かぶチェック事項を挙げてみます。 ・文字列は全て終端 '\0' で止めてあるか  Debug 版は各領域の間に余裕が有る為、バッファ外で '\0' を拾って  助かっている可能性が有ります。 ・strcpy, strcat, sprintf  上記またはこれらと同等のAPIで、受け側の大きさは足りているか  (バッファサイズは問題無いとのことでしたが…) ・動的バッファのポインタや各種ハンドルを多重解放していないか  free や close 系は NULL 以外で実行、実行したらポインタに NULL  を代入、としておけば間違いは減りますね。 マルチスレッド環境なら ・共有領域に排他制御が施されているか ・スレッド間で処理順序に依存する部分は同期処理が施されているか ・strtok 等、そのままではマルチで使えない関数を使っていないか 先ずはこんな所かな… 必ず再現する障害のデバッグ方法として、Release 版で手軽なのは トレースログですね。 適当な所に通過確認とバッファの内容確認を兼ねてログやメッセージ ボックスを仕掛けます。 しかし、最初から全体に事細かにログを仕掛けると厳しいです。 コツは処理の中間地点に仕掛けて、それより前半か後半かを特定。 次はまた特定された側の中間にログを…、と段々と囲い込みます。 但し、ログを仕込んだ事で領域の配置が変わり、障害が発生しなく なるという罠も希に有ります。心の片隅にでも留めておいて下さい。

zico2
質問者

お礼

ご教示ありがとうございます。 Debug版とRelease版で そのような違いがあったとは知りませんでした。 ご指摘の点を中心に調べましたところ、 sscanf関数を実行するときに、 バッファが1文字分(NULL文字分) 足りなかったところが見つかり、 配列を大きくしたところ、 うまく解決できました。 本当に、本当に、助かりました。 どうもありがとうございました。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

Release版でデバッグかな? Release版でもデバッグ情報をもたせることは可能です。 プロジェクトのオプションを変更してみてください。 方法はMSDNライブラリを見るとかいてあるはずです。 #1の方がかかれているように、デバッグビルドですとメモリの確保に余裕がありますが、Release版なら結構詰められますので再現できるかもしれません。 ただし、最適化をしてしまうとデバッグ情報は付加できないので、この方法にも限度はあります。

zico2
質問者

補足

ご教示ありがとうございます。 Release版でデバッグできるとは知りませんでした。 MSDNとGoogole等で「Release(版)」AND「デバッグ」で 検索してみたのですが、 Release版でデバッグする方法が分かりません。 プロジェクト/プロパティ/リンカ/デバッグ情報で デバッグ情報を持たせるを「はい」等にしてみましたが、 ブレークポイントで止まってくれませんでした。。。。 大変恐れ入りますが、 参考URLを教えて頂ければ助かります。 よろしくお願いします。

関連するQ&A

  • リリースビルドの作成

    VisualC++ 2005 Express Editionを使って、C言語の簡単なプログラムを作りました。コンパイルの際に出てくるエラーや警告は一切ない(デバッグモード、リリースモード両方)のですが、このリリースビルドをVC++をインストールしていないPCで実行しようとすると、「指定されたプログラムは実行できません。」と出て実行できません。コンパイルに使ったPCでは実行できます。 リリースビルドを作成の際、ツールバーにある"Debug"を"Release"に切り替えて、ソリューションをビルドしました。プロジェクトはWin32コンソールにして、空のプロジェクトから始めました。 なぜ、バイナリが実行できないのでしょうか? そもそも、リリースビルドの作成法はこれでいいのでしょうか?

  • VS2008 C++ リリースモードでエラー

    表題の環境でMFCベースのプログラムを開発しています。 リリースモードで実行を試したところ、同じようなタイミングで強制終了が発生します。 (おそらく、自前のDLL内で落ちている?) デバッグモードのEXEを直接起動しても、強制終了が発生します。 りかし、VSからリリースモード(当然、デバッグモードも)の実行を行うと、エラーが発生しません。 VSから実行する場合、参照するDLLはVSを使用しない場合とは違うDLLを参照するのでしょうか。 その他、このような状況での対処方法について、アドバイスをいただけませんでしょうか。

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

    現在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で実行することはできないのでしょうか? よろしくお願いします.

  • リリースモードとデバッグモードの違い (具体的な違い)

    DebugとReleaseモードで作成された実行ファイルの速度の違いですが、 一般的にどれくらいの差があるのでしょうか?(だいたいn%遅いとか) リリースモードの場合は最適化も行われるということですがデバッグモードは何か付加されるのでしょうか? このあたりの理解をしっかりしたいのですが、参考になる書籍をご存知の方、教えてください。

  • VC Debugモード

    Visual Stdio .NET 2003 環境のDebugモードについて質問があります。 開発言語は C++です。 今、コマンドライン引数を以下のように設定し、ファイルに保存された 情報を処理するプログラムを作成しています。 test1.exe 0 ./input.txt ↑ [実行ファイル名][検索したい文字][処理したいファイルへのパス] 上のように入力した場合、argcは[3]を返すと思うのですが、Debug モードでいざ実行してみると、値は「4」となっていました。 コマンドライン引数はVCの「プロジェクト」→「**のプロパティ」 →左ウィンドウの「デバッグ」→右ウィンドウの「コマンド引数」に 上のように設定しています。 また、Debugモードでargv[0]を調べたところ、実行ファイルまでのパス が保存されていました。 なぜ、このようになるのでしょうか? あと本題からそれるのですが、ソースの中でVCがDebugモードで動作していることを知る方法はないでしょうか? もし、Debugモードなのかどうかがわかるのであれば、ソースをDebug モード用とReleseモード用とに切り替えられるようにしたいのですが。。。 合わせてお教えください。

  • CRCの計算でエラー

    VisualC++2008でプログラミングしております。簡単なモデムプログラムを作っているのですが、エラー検出で利用するCRCでつまづいています。具体的には、特定のファイルを送信しようとすると常にエラーが発生したと判断され、再送要求をし続けてしまいます。 以前、チェックサムでXORを利用した時も同様なことが発生したので、XORの計算があやしいのかなと感じています。デバッグでは正しく計算されるようなのですが、リリースで実行すると上記のようになります。 どなたかアドバイスを頂ければと思います。よろしくお願いします。

  • vc++ 関連

    ぼくは今vc++2008 を使っています. デバッグなしで実行だとでエラーになるのに デバッグだとエラーにならない というわけのわからないバグで混乱しています. デバッグモードだとエラーが出ないので バグが見つけられなくて困ってます. そういう事ってあるんですか? ちなみにエラーメッセージは Debug Assertion Failed! Program: ...ments\Visual Studio File: c:\program files\microsoft visual studio 9.0\vc\include\list Line: 218 Expression: list iterator not dereferencable です.

  • Visual C++2008でおきたエラーについて

    現在VisualC++2008でゲームを作っているのですが、 BGMをつけようと思いプログラムを少し追加したのですが test.exe の 0x005653b1 で初回の例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 test.exe の 0x005653b1 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000060 を読み込み中にアクセス違反が発生しました。 プログラム '[2956] test.exe: ネイティブ' はコード 0 (0x0) で終了しました。 と言ったエラーが出てきてしまい止まってしまいます、とりあえずCtrl+Zで最初の状態にもどしたにもかかわらず実行しようとすると上と同じエラーが出てきてしまい起動できなくなってしまいました、上のエラーはどのようなときに起こるのでしょうか?それとどうすれば回避できるか教えてくださいm(_ _;m) ソースファイルを張りたいのですが2000文字超えているのでむりでした・・・。

  • リリースモードの時にリンカエラーが発生します

    リリースモードの時にリンカエラーが発生します Visual Studioで、自作ライブラリを使ったプログラムの開発をしていたのですが、リリースモード時にリンカエラーが発生してしまいました。 デバッグモード時は特に問題なくリンクできるのですが、リリースモードでコンパイルをすると以下のようなエラーが発生します。 LibGame.lib(Game.obj) : error LNK2001: 外部シンボル ""bool __cdecl FileExists(class std::basic_string,class std::allocator >)" (?FileExists@@YA_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" は未解決です。 LibGame.lib(Mesh.obj) : error LNK2001: 外部シンボル ""public: struct ARCHIVE_ENTRY * __thiscall CArchive::Find(class std::basic_string,class std::allocator >)" (?Find@CArchive@@QAEPAUARCHIVE_ENTRY@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" は未解決です。 LibGame.lib(Mesh.obj) : error LNK2001: 外部シンボル ""class std::basic_string,class std::allocator > __cdecl ExtractFilePath(class std::basic_string,class std::allocator >)" (?ExtractFilePath@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@Z)" は未解決です。 Release/ShtGame.exe : fatal error LNK1120: 外部参照 3 が未解決です。 プロジェクトのプロパティ等でリンク先のライブラリを有無やヘッダをチェックしたのですが、原因がつかめませんでした。 どのようなエラー原因が考えられるでしょうか? よろしくお願いします OS:Windows XP SP3 言語:VC++ 開発環境:Visual Studio 2005 Academic Edition

  • VC++6.0からVC++2010への移行

    マシンAの VC++6.0 から マシンBの VC++2010 へ移行し、Releaseモード でビルドした結果、正常動作しませんでした。 Releaseモード、Debugモード ではエラー、警告ともにありません。 ■ 6.0 と 2010 パラメータ ■ ・共有 DLL で MFC を使う ・マルチスレッド DLL ・警告レベル 3 ■マシンA環境■ ・Windows XP Professional 2002 Service Pack 2 ・.NET Framework 1.1 ・Visual Studio 6.0 Enterprise Edition ■マシンB環境■ ・Windows XP Professional 2002 Service Pack 3 ・.NET Framework 1.1 、2.0 、3.0 、3.5 、4.0 ・Visual Studio 2005 Professional Edition ・Visual Studio 2010 Professional Edition ・Visual C++ 2008 Redistributable 作業の経緯と致しましては、6.0 のプロジェクトを VS2008 でビルドし、 sln ファイルを生成しました。 その後、生成された sln ファイルをもとにVS2010でエラーと警告の解除作業をしました。 Debugモード で エラー、警告 がないことを確認し、Releaseモード でビルドした結果、現状に至っております。 マシンB環境で問題なく 6.0 プログラムが動作している(Debug、Releaseともに)ことから環境面に原因があると考えております。 どのような問題が考えられるのか、また、どのような調査を行うべきか、ご教示頂きたいです。 よろしくお願い致します。

専門家に質問してみよう