Windows应用程序崩溃与纯虚函数调用

时间:2011-04-18 16:51:17

标签: c++ windows crash release

我有一个Windows应用程序,它时不时地崩溃而不能再生产。 当它,我得到纯虚函数调用。我已将其设置为使用ADplus创建Windows转储,即使崩溃也没有转储。

我很确定这是构建错误,我正在使用VC2008 SP1构建,这是发布版本。

对此有何见解?我该如何调试它,它是一个带有.pdb文件和映射文件的发布版本。

由于 礼

7 个答案:

答案 0 :(得分:2)

首先,请确保您不是calling pure virtual function。如果不是这种情况,请尝试在WinDbg下启动您的计划。

答案 1 :(得分:2)

正如已经指出的那样,这不太可能是构建错误。我有一个非常复杂的项目有类似的问题,并能够通过使用_set_purecall_handler并提供我自己的处理程序来跟踪它。这样我就可以在调试器发生时进入调试器并查看调用堆栈。显然,这里的替代方案是在发生时创建minidump。请记住,在程序遇到异常之前,您需要为minidump 准备一切。

但是,这也可能是由于堆损坏引起的。在这种情况下,我会期待各种各样的症状。您描述了这个特定的症状,因此您的代码可能确实存在错误。

我上面提到的项目是一个遗留项目,模仿类似于COM的东西,确实存在编译器无法找到纯虚函数的所有场合的地方,在派生类中没有实现。

答案 2 :(得分:1)

  

我很确定这是构建错误

非常非常 un 。这很可能是你的代码中的一个错误。

你可能在某个地方slicing an object。如果您的应用程序设置为在unhanded exceptions上生成转储文件,并且您仍然没有转储文件,那么它很可能是异常处理程序中的错误。

您需要获取转储文件。这应该是你的首要任务。

答案 3 :(得分:0)

如果您的问题不是很稳定,那么很可能在索引写入之外会出现一些问题,这些问题可能会破坏内存

答案 4 :(得分:0)

如果您尝试过完全重建,那么它似乎更有可能是编码问题。

您是否在任何构造函数或析构函数中调用任何(纯)虚函数?

更有可能的是,您在已删除的对象上调用纯虚函数,并且vtable已移动到指向父对象。在这种情况下,valgrind(免费,Linux)或Purify($$$,Windows)将真的能够帮助你。 VS也可能有内存检查器。

答案 5 :(得分:0)

我曾经遇到过与C ++类似的问题。我在某处调用了一个来自构造函数的虚函数,因此在调用发生时对象尚未构造,解释了所谓的“纯”虚函数。如果你在对象上有错误的强制转换而不是指向对象的指针,那么它也可能是切片的问题。使用调试器和分步/回溯查找源代码,以便我们为您提供更好的帮助。

答案 6 :(得分:0)

我有同样的错误。我多次查看代码,从未在构造函数或析构函数中找到虚函数。 问题出在构建系统中。我的计算机上有一个旧的静态库版本,其中某些功能不是纯虚拟的,而当它成为新的时候(我又增加了一个抽象层)。因为EXE文件是使用旧的静态库创建的,但是新的标头出现了此错误。 因此,如果没有其他帮助,请确保您的库和包含文件版本一致。