我有一个Windows应用程序,它时不时地崩溃而不能再生产。 当它,我得到纯虚函数调用。我已将其设置为使用ADplus创建Windows转储,即使崩溃也没有转储。
我很确定这是构建错误,我正在使用VC2008 SP1构建,这是发布版本。
对此有何见解?我该如何调试它,它是一个带有.pdb文件和映射文件的发布版本。
由于 礼
答案 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文件是使用旧的静态库创建的,但是新的标头出现了此错误。 因此,如果没有其他帮助,请确保您的库和包含文件版本一致。