【发布时间】:2011-06-05 11:58:38
【问题描述】:
这是一个不寻常的问题,但这里是:
在我的代码中,我不小心在某处取消引用 NULL。但是,应用程序并没有因段错误而崩溃,而是似乎停止了当前函数的执行,并将控制权返回给 UI。这使调试变得困难,因为我通常希望收到崩溃警报,以便我可以附加调试器。
这可能是什么原因造成的?
具体来说,我的代码是一个 ODBC 驱动程序(即 DLL)。我的测试应用程序是 ODBC Test (odbct32w.exe),它允许我在我的 DLL 中显式调用 ODBC API 函数。当我调用具有已知段错误的函数之一时,ODBC 测试不会使应用程序崩溃,而是将控制权简单地返回给 UI,而不打印函数调用的结果。然后我可以再次调用驱动程序中的任何函数。
我确实知道,从技术上讲,应用程序调用 ODBC 驱动程序管理器,该管理器加载和调用我的驱动程序中的函数。但这无关紧要,因为我的段错误(或发生的任何事情)会导致驱动程序管理器函数也不返回(正如应用程序不打印结果所证明的那样)。
我的一位使用类似机器的同事遇到了同样的问题,而另一位则没有,但我们无法确定任何具体差异。
【问题讨论】:
-
我喜欢这个问题的标题......但我不能可能在没有错误的情况下发布它!
-
你似乎已经提供了一切,除了代码。也许编译器正在优化那些什么都不做的代码。
-
我想异常正在某个地方处理?
-
我和 EboMike 在一起,有东西会赶上 AV
-
取决于上下文 - 通常任何此类操作都会导致页面错误错误,因为您无法读取 0x00000000(或附近)。这个抛出将向上传播到任何处理程序接受它的堆栈。没有处理程序 -> 返回操作系统/运行时系统,一般来说,它会卸载有问题的 .exe 并终止进程。该链中有大量机会拦截该行为,不了解您的上下文,无法说出究竟是什么可能代表您进行调解。
标签: c++ windows-7 odbc segmentation-fault