我有一个VS2017 .NET程序已开始崩溃,并显示以下对话框消息:
Microsoft Visual C++ Runtime Library
Runtime Error!
Program: [program.exe]
R6025
-pure virtual function call
此对话框在我的程序外部产生。
当我在VS2017中调试程序时,过一会儿出现对话框,但程序仍正常运行。 只有单击“确定”后,程序才会停止。我得到了AppDomain.CurrentDomain.ProcessExit的调用,但是没有有关导致程序退出的原因的信息。
Windows事件日志显示所涉及的dll之一是MSVCR110.dll:
Faulting application name: XXX.exe, version: 1.0.0.0, time stamp: 0x5c4aecde
Faulting module name: MSVCR110.dll, version: 11.0.51106.1, time stamp: 0x5098858e
Exception code: 0x40000015
Fault offset: 0x000a327c
Faulting process id: 0x128c
Faulting application start time: 0x01d4b6d3eed97aed
Faulting application path: C:\Users\dkrewind\AppData\Local\Apps\2.0\DBXO5LPH.PYZ\PTX522V3.2EO\insq..tion_1733f97596464edb_0001.0000_013e50ce80c4530d\XXX.exe
Faulting module path: C:\Windows\system32\MSVCR110.dll
如何了解有关此错误的更多信息?是否有可能找出导致崩溃的非法呼叫来自何处? 该程序解决方案具有多个第三方dll和一些C ++项目。
答案 0 :(得分:0)
您看到的是虚拟呼叫的“默认处理程序”。
在C ++中,纯虚拟函数的定义类似于virtual void foo() = 0
。具有纯虚函数的类无法单独实例化,但可以是基类。派生类必须重写纯虚函数。
现在在C ++中,在派生类的构造过程中,对象的类型随构造函数的运行而变化。基类ctor首先运行,在此阶段,对象的类型仍然是基类型。这意味着您不能调用纯虚函数。仅当派生的ctor运行时,派生类的替代才可用。这很有道理;该覆盖可能非常需要尚未初始化的派生类的成员。
Visual C ++为纯虚函数添加了一个占位符函数。这是标准允许的;调用纯虚函数是未定义行为,因此对话框完全可以。此时,您可以连接调试器并检查调用堆栈。那应该直接告诉您呼叫的来源。