Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 Windows 7 Visual C++;2008奇怪的Seg故障和空指针行为_Visual Studio 2008_Visual C++_Windows 7_Transactions_Segmentation Fault - Fatal编程技术网

Visual studio 2008 Windows 7 Visual C++;2008奇怪的Seg故障和空指针行为

Visual studio 2008 Windows 7 Visual C++;2008奇怪的Seg故障和空指针行为,visual-studio-2008,visual-c++,windows-7,transactions,segmentation-fault,Visual Studio 2008,Visual C++,Windows 7,Transactions,Segmentation Fault,当我们的开发机器升级到Windows7时,一些奇怪的事情开始发生。当我们的程序(Visual C++ 2008,一些OWL到MFC适配器,SQL Server,N88R2)访问一个空指针时,它不会像预期那样崩溃,而是继续运行,只关闭实际窗口。这可能是个好主意,但这会使数据库事务处理成为一场噩梦。如果程序中出现隐藏的崩溃,则带有未提交更改的已启动事务将保持打开状态,用户可以继续使用该程序。当下一个事务正常提交时,前半个已完成事务中的“挂起”更改也会保存。这绝对不是故意的,会导致数据损坏 在Wind

当我们的开发机器升级到Windows7时,一些奇怪的事情开始发生。当我们的程序(Visual C++ 2008,一些OWL到MFC适配器,SQL Server,N88R2)访问一个空指针时,它不会像预期那样崩溃,而是继续运行,只关闭实际窗口。这可能是个好主意,但这会使数据库事务处理成为一场噩梦。如果程序中出现隐藏的崩溃,则带有未提交更改的已启动事务将保持打开状态,用户可以继续使用该程序。当下一个事务正常提交时,前半个已完成事务中的“挂起”更改也会保存。这绝对不是故意的,会导致数据损坏

在Windows7之前,我们并不关心这一点,崩溃就是崩溃。程序已关闭,所有正在运行的事务都已回滚


我们如何才能切换回旧的行为?

您可以使用自己的未处理异常例程来捕获SEGFULTS/访问冲突

// 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);
您不应该总是崩溃的原因是,某些依赖项可能依赖于是否能够处理segfault。您应该使用一种机制来动态地打开或关闭此功能,这取决于您预期崩溃的位置。除非您确实确定它不会被破坏,否则最好忽略所有内容,除了地址为0或0左右的无效访问。如果0x1000超出了我的范围,我会取一个值,因为我不希望对象中的任何偏移量大于程序中的偏移量


额外信息:

为什么不修复崩溃?崩溃是某种严重错误的迹象,也许这个问题除了崩溃还有其他副作用?我在生产中看到了这个问题。当它在客户机器上崩溃时。就实际行为而言,客户甚至不知道自己撞车了。他刚才使用的对话消失了。好像一切都成功了。我认为这是一个糟糕的用户界面设计。用户应该始终知道他或她所做的操作是否成功。我完全同意,从用户的角度来看,未经处理的崩溃不是一个可接受的解决方案。但这样一来,它就可以在WindowsVista和之前的版本中使用相同的产品(相同的版本)。我要强调的是,同一个构建只需在另一个操作系统上运行,其行为就会有所不同。也许我们在这里完全是白痴,做的每件事都是错的,但我们做了很长时间的生意,我们做了很多依赖于数据库事务正常工作的数字运算,至少在windows 7之前,我们可以确定,崩溃会终止程序并回滚事务。