作成したC++アプリケーションのリリースビルドを生成しようとしています。VS2008内からアプリケーションを実行すると、アプリケーションは正常に実行されます(デバッグとリリース)。ただし、実行可能ファイルを実行すると、ほぼ毎回クラッシュします。
さて、すべてのコードを実行してそれを引き起こしているバグを見つけることなく、このアプリケーションをスタンドアロンアプリケーションとして実行できるようにするためのハックはありますか?
前もって感謝します。
要するに、違います。
バグを見つける必要があります。VS内で機能する場合は、タイミングの問題であると推測するのは危険です。共有スレッドデータを上書きしている可能性があります。これは、内部で発生する可能性は低くなります(ただし、確認することは可能です)。 VSは、デバッグ環境で実行されているため、少し遅くなります。
バグを見つけるのに助けが必要な場合は、詳細を教えてください。それ以外の場合は、デバッグシンボル(pdbs)を使用してリリースをビルドし、システムデバッガーとしてDrWatsonをインストールして、スタンドアロンで実行します。クラッシュすると、DrWatsonはミニダンプファイルを作成し、これをWinDbg(私のお気に入り)にロードすると、バグがどこにあるかを正確に確認できます(ダンプに例外が含まれていることが通知され、デフォルトで表示されます) 。これを正しく行うには、ソースコードパスとWinDbgのシンボルへのパスを追加する必要があります)。
次に、アプリがオンサイトで実行されている場合のクラッシュを診断する方法もわかります。
外部リソースを読み込んでいますか?C++プログラムで相対パスが正しいことを確認する場合。
1つの可能性は、プログラムが初期化されていないヒープデータを使用していることです。デバッガーからプログラムを起動すると、NTデバッグヒープが有効になります。これにより、ヒープアロケータは新しいメモリブロックを塗りつぶしパターンで埋め、ヒープチェックも可能になります。デバッガーの外部から同じプログラムを起動すると、NTデバッグヒープは無効のままになりますが、プログラムがCランタイムのデバッグバージョンに対してリンクされている場合、CRTデバッグヒープは引き続き有効になります。
可能性ははるかに低いですが、プログラムをプロセストークンに設定する必要SeDebugPrivilege
がある可能性があります。デバッガーは、プロセストークンでこの特権を有効にします。これには、デバッガーから起動されたすべてのプログラムがこの特権を継承するという副作用があります。OpenProcess()
プログラムが//を使おうとしてエラーを正しくReadProcessMemory()
処理WriteProcessMemory()
しない場合は、クラッシュする可能性があります。
[ファイル]=>[Visual Studioで開く]に移動して.exeを開くこともできるため、デバッガー自体で起動することはありません。それが役立つかどうかわからない。
いくつかの可能性があります。すでに述べたことに加えて、Visual Studioからアプリを実行すると、VisualStudioインスタンスと同じセキュリティコンテキストで実行されます。したがって、たとえば、Vistaで作業している場合、保護されたファイルまたはレジストリにアクセスしようとすると、未処理のセキュリティ違反が発生する可能性があります。
デバッグバージョンをビルドしてスタンドアロンで実行するとどうなりますか?クラッシュしますか?その場合、通常はそこからデバッガーに侵入し、コールスタックを取得して、誤動作が何であるかを確認できます。
あなたが与えた詳細から、それは図書館の問題があるかもしれないように思われます。同じコンピューターでプログラムを実行していますか?そうでない場合は、アプリケーションに適切なライブラリをデプロイする必要もあります。同じコンピューターで実行しているが、開発環境の外部にある場合は、アプリケーションが適切なライブラリを認識できることを確認してください。
リリースでデバッグするのに最適な方法は、クラッシュが発生したときにクラッシュダンプを作成することです。このダンプを使用すると、開発用コンピューターにデバッグシンボルをロードして、何が起こっているのかを確認できます。詳細はこちら:http ://www.debuginfo.com/articles/effminidumps.html