0

私たちの開発マシンが Windows 7 にアップグレードされるまでに、奇妙なことが起こり始めました。私たちのプログラム (visual c++ 2008、フクロウから mfc へのアダプター、sql server 2008r2) がたとえば null ポインターにアクセスすると、予想どおりにクラッシュしませんが、実際のウィンドウを閉じるだけで実行されます。良い考えかもしれませんが、これはデータベース トランザクションの処理を悪夢にします。プログラムで隠れたクラッシュが発生した場合、コミットされていない変更で開始されたトランザクションは開いたままになり、ユーザーはプログラムを使用し続けることができます。次のトランザクションが正常にコミットされると、前半の完了したトランザクションで「ハング」した変更も保存されます。これは明らかに意図したものではなく、データの破損につながります。

Windows 7 が登場する前は、クラッシュはクラッシュだったので、気にしませんでした。プログラムが閉じられ、実行中のすべてのトランザクションがロールバックされました。

以前の動作に戻すにはどうすればよいでしょうか?

4

1 に答える 1

1

独自の未処理の例外ルーチンを使用して、segfaults/アクセス違反をキャッチできます。

// 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

于 2012-04-16T10:13:06.390 に答える