Re: Releaseビルド後のexeファイル実行について ( No.1 ) |
- 名前:管理人 日時:2011/04/11 01:11
Releaseビルド と Debugビルドでは主にスタックメモリ( 関数が終わったときに戻るべきメモリアドレスや
引数やローカル変数を記憶する領域 )周りの扱いが違う( Debugビルドではローカル変数は一律で特定の値に
初期化されたり、エラーチェックのために余分にローカル変数用のメモリを確保するので
若干のメモリの不正なアクセス( 配列の宣言用素数以上の値にアクセスする等 )が発生しても
一見何事も無く動作してしまうなど )ので、Debug ビルドでは動作したのにRelease ビルドでは動作しない、
ということはそれなりの確率で発生します
Release ビルドでは実行時のデバッグ機能が結構適当になってしまいますが、一応使うことができますので
「ここまで実行できているかな?」と思える部分にブレイクポイントを置いた上で Release ビルドのプログラムを
VisualC++ 2008 上からデバッグ実行して、プログラムがどこまで動作しているかを調べてみてください
あと、前述の通りスタックメモリ周りの動作が変化しますので、
初期化していないローカル変数を使っている箇所が無いかや、ローカル配列の要素数以上の要素に
アクセスしてしまっていないかなども確認してみてください
|
Re: Releaseビルド後のexeファイル実行について ( No.2 ) |
- 名前:Dec 日時:2011/04/13 01:07
>管理人様
アドバイスありがとうございます.
Debug,Releaseでのスタックメモリの振る舞いが違うことが大きく影響しているかもしれないですね.
その後,未初期化変数の使用や配列外にアクセスしているかどうか調べたのですが,どうやらそれらの問題については大丈夫のようでした.
VisualC++2008のプロジェクト上からのデバッグ(F5)ではプログラムはDebug,Releaseともに正常に動いています.
ブレイクポイント置いて確かめるということで,VisualC++2008上からのデバッグは可能ですが
Releaseビルド後にReleaseフォルダ上に作成されるexeファイルからの実行に対しては,
プログラムがどこまで動いているかについて把握することはできるのでしょうか?
いっそのこと現在作成中のプロジェクトを一度解体して,
ファイルを少しずつを追加しながらバグが発生する原因を確かめようかとも検討しています.
|
Re: Releaseビルド後のexeファイル実行について ( No.3 ) |
- 名前:管理人 日時:2011/05/03 19:49
ご返信が遅くなり申し訳ありません
> VisualC++2008のプロジェクト上からのデバッグ(F5)ではプログラムはDebug,Releaseともに正常に動いています.
もしかして、Releaseフォルダ上に作成される exe ファイルを Releaseフォルダ上で実行してしまって
VisualC++2008上で F5 実行した場合とは起動時のカレントフォルダが違ってしまうのでデータファイルに
アクセスできていない、ということでしょうか?
もしその場合でしたら、Release フォルダ上にある exe ファイルを一つ上のフォルダに移動して
実行してみてください
> Releaseビルド後にReleaseフォルダ上に作成されるexeファイルからの実行に対しては,
> プログラムがどこまで動いているかについて把握することはできるのでしょうか?
ErrorLogAdd と ErrorLogFmtAdd という関数があり、この関数で Log.txt に文字列を出力することができます
使用例:
ErrorLogAdd( "テスト出力1" ) ; // ErrorLogAdd は文字列だけ
ErrorLogFmtAdd( "数値出力 %d ", 5000 ) ; // ErrorLogFmtAdd は printf と同じ書式出力が可能
随所にこの関数で文字列出力をして、その地点をプログラムが実行されたかどうかを確認したり
その時点での変数の値などを出力することができます
|