0

私たちの開発マシンがWindows 7にアップグレードされるまでに、何か変なことが起こり始めました。私たちのプログラム(Visual C++ 2008、owl to mfc adapter、SQL server 2008r2)がnullポインタにアクセスすると、期待通りにクラッシュしませんが、実際のウィンドウを閉じるだけです。良いアイデアかもしれませんが、これはデータベーストランザクション処理を悪夢にしています。プログラムの隠れたクラッシュの場合、コミットされていない変更を含む開始されたトランザクションは開かれたままであり、ユーザーはそのプログラムを使用し続けることができます。次のトランザクションが正常にコミットされると、完了したトランザクションの最初の半分での変更内容が保存されます。これは間違いなく意図されておらず、データの破損につながります。Windows 7 Visual C++ 2008 Strange Segフォールトとヌルポインタの動作

Windows 7以前は気にしなかったが、クラッシュはクラッシュだった。プログラムが終了し、実行中のすべてのトランザクションがロールバックされました。

これまでの動作に戻すにはどうすればよいですか?

+0

クラッシュを修正するだけではないのはなぜですか?クラッシュは、何かが重大に間違っているという兆候です。クラッシュ以外に副作用がありますか? –

+0

私は生産上の問題を参照してください。それが顧客のマシンでクラッシュしたとき。実際の行動では、顧客は彼が墜落したことを知らない。彼が使っていたダイアログは消えるだけです。すべてが成功したかのように。 – user331471

+0

私はひどいユーザーインターフェイスの設計だと思います。ユーザーは、自分が行った行動が成功したかどうかを常に把握しておく必要があります。 –

答えて

1

segfaults/access違反をキャッチするために、独自の未処理例外ルーチンを持つことができます。

// global scope 
    bool in_region_of_interest(_EXCEPTION_POINTERS *ep) { 
     // TODO: Check if you aren't breaking some 3rd party functionality by exiting now. 
     return ep && ep->ExceptionRecord; // Pretty much a stub. 
    } 
    static const bool feelin_gentle = false; // Do we care for semi-clean exits? 
    static const DWORD min_virt_rng = 0x1000; // max virtual address that 'indicates' null ptr access. 
    LONG WINAPI my_unh_exc_hndlr(_EXCEPTION_POINTERS *excPtrs) 
    { 
     if (in_region_of_interest(excPtrs)) { 
      DWORD code = excPtrs->ExceptionRecord->ExceptionCode; 
      if (EXCEPTION_ACCESS_VIOLATION == code && // If fingers burn in fire. 
       min_virt_rng > excPtrs->ExceptionRecord->ExceptionInformation[1]) { // If it was a *(void*)0 that we accessed. 
       if (feelin_gentle) 
       ExitProcess(code); 
       else 
       TerminateProcess(GetCurrentProcess(), code); 
      } 
     } 
     return EXCEPTION_CONTINUE_SEARCH; // Give control to the next filter. 
    } 

// ... somewhere in the beginning of main() 
    SetUnhandledExceptionFilter(my_unh_exc_hndlr); 

理由あなたは常にべきではないのクラッシュは、いくつかの依存関係がセグメンテーションフォルトを扱うことができることに依存かもしれないということです。クラッシュが予想される場所に応じて、この機能をオンまたはオフに動的に切り替えるメカニズムを使用する必要があります。あなたが本当にそれが壊れないと確信していない限り、それはゼロまたは0のアドレスで無効なアクセスを除いてすべてを無視することをお勧めします。私は私のお尻から0x1000の値を取った、私のプログラムのそれよりも大きい。

追加情報:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363082(v=vs.85).aspx

関連する問題