2017-08-25 11 views
2

私は非常に奇妙な問題があります。当社のアプリケーションは、C++で書かれたVisual Studio 2017でコンパイルされたデスクトップアプリケーションです。ここ数週間は、アプリケーションがmainに入る前にクラッシュすることがあります。私はそれを知っている。なぜなら私はメインの最初の行にブレークポイントを置くので、決して呼び出されないからだ。クラッシュはすばやく起こるわけではないので、私は診断ツールでブレークを押す時間があります。しかし、私はあなたのアプリケーションがブレーク状態に入ったというメッセージしか出ませんでしたが、すべてのスレッドが外部コード(通常はシステムコードまたはフレームワークコード)を実行していたので表示するコードはありません。時には、すべてのものを掃除して再構築してコードを動作させることもありますが、しばしばそうではありません。メインに入る前にプログラムがクラッシュした場合の対処方法

私はこれを調査する方法を知らず、コードは数年前にこの問題を抱えていませんでした。

どうすればいいですか?

編集

提案し、私はのWinMainCRTStartupにブレークポイントを設定し、私は224の機能__scrt_common_main_seh行目に問題をトレースとして()exe_common.inl中:

(_initterm_e(__ xi_a場合、__xi_z)=! 0) return 255;

その行が失敗したので、関数は255を返し、私のメインは呼び出されません。それ以上のアイデアは?

+2

*任意の*クラッシュのために行う通常のことは、デバッガでそのコードをキャッチし、コードのどこに発生するかを特定することです。もしあなたのコードから出てこないのであれば、Windowsはプロセスごとにデフォルトの1メガバイトのスタックしか持っていないので、 'main'関数で大きな配列を探すべきです。多くのまたは大きなローカル変数(配列を含むローカル変数は通常スタックに格納される)のためにスタックオーバーフローが発生します。 –

+1

大きな配列を*持っていなければ、デバッガはクラッシュを捕らえて、大域変数の初期化を指しているはずです。 –

+1

私がチェックするオプションの1つは、いくつかの欠けている依存関係です。すべての依存DLLがある場合、作業ディレクトリが正しく設定されているかどうかを確認します。 – Dusteh

答えて

0

最終的に私のプログラムが再び動作するようになりました。なぜなら、プログラムはVisual Studio 2017でコンパイルされていますが、私のプログラムと静的にリンクするライブラリの一部は、Visual Studio 2017を使って再コンパイルした後、以前のVisual Studioを使ってビルドしています。

プログラムがクラッシュして終了する前に、すべてのライブラリが同じコンパイラを使用してビルドされ、同じコンパイラスイッチを使用していることを確認してください。

2

デバッガがキャッチすることに問題があると仮定すると、かもしれないというアイデアしかありません。 set_terminateで自分のterminate機能を設定するのはどうですか? http://www.cplusplus.com/reference/exception/set_terminate/ 静的なグローバル変数のコンストラクタでそれを行うことができます。これは、ソフトウェアをクラッシュさせる前に呼び出される可能性があります。不変な静的変数の初期化の順序は未定義です。 中にブレークポイントを設定してください。

int main() 
{ 
    throw 0; 
    return 0; 
} 

struct reterminator 
{ 
    static void myterminate() { 
     std::cerr << "terminate handler called\n"; 
     abort(); // forces abnormal termination 
    } 

    reterminator() 
    { 
     std::set_terminate(myterminate); 
    } 
} static reterminator_; 
関連する問題