2010-11-25 8 views
0

私はMS Visual C++ 2005で書かれたアプリケーションを持っています。クライアントのコンピュータでは失敗しました。私は失敗を再現することはできません。分析のために必要なのは、アプリケーションによって作成されたログだけです。アプリケーションでは、私は次の断片います。ログでスタックオーバーラップ中に2つのデストラクタのうちの1つが呼び出されない

class EntranceLoggerForFunc 
{ 
public: 
EntranceLoggerForFunc() 
{ 
    WriteToLog("EntranceLoggerForFunc"); 
} 
~EntranceLoggerForFunc() 
{ 
    WriteToLog("~EntranceLoggerForFunc"); 
} 
} 

void Func() 
{ 
    EntranceLoggerForFunc logger; 
    .... 
    if (<some comdition>) 
     Func(); 
    .... 
} 

void Func2() 
{ 
    try 
    { 
     Func(); 
    } 
    catch(...) 
    { 
     WriteToLog("Exception happened"); 
    } 
} 

アプリケーションが(SEH例外とC++の例外を有効にするキー/ EHAでコンパイルされている

私は、以下を参照してください。

EntranceLoggerForFunc EntranceLoggerForFunc 〜EntranceLoggerForFunc 例外は、言い換えれば

が起こっ、例外はのFunc()内のどこかで起こりました。 dはFunc2()に捕らえられていた。しかし、なぜ、EntranceLoggerForFuncの2つのオブジェクトのデストラクタが、スタックの巻き戻し中に呼び出されただけですか?

私は次のバージョンしか持っていません:スタックは何らかの形で損傷しています(おそらく、例外を引き起こした同じ誤った操作によって)、これはデストラクタの1つが動作しなかった理由です。

他のバージョンはありますか?

+0

問題を再現するコンパイル可能な例を投稿できますか? –

+0

BTW-ご質問に常にお答えしてください。これがStackOverflowの仕組みです。左に緑色のチェックマークを付けることで、回答を「承認済み」とマークすることができます。 – Kos

答えて

2

もう1つの可能性は、WriteToLogが4回目の呼び出しで例外をスローする方法です。

2

スローされた例外がC++例外ではなく、Win32 SEH例外(EXCEPTION_STACK_OVERFLOWまたはEXCEPTION_ACCESS_VIOLATIONなど)の場合、例外処理の動作は...エラーになります。

(EHAは、もはやのVisual Studio 2010のデフォルト設定である理由はありません)

私の推測では、実際の例外は、そのようなメモリ破壊の結果であったアクセス違反、(として、SEH例外であるということですしたがって、プログラムの状態は、で始まるように拘束されました)。

+0

SEH例外だったのですが、catchブロックをトリガーするとは思いません。 – JaredPar

+0

返信いただきありがとうございます。 '彼は例外処理の動作が...間違っています..奇妙です - あなたは問題についてのリンクを持っていますか? – KellyLynch

+0

@JaredPar:SEH例外をcatch(...)ブロックで捕捉するようにVSを設定できます。 – Puppy

関連する問題