我的应用程序(EasyJob)退出时导致访问冲突错误。这仅在某些系统上发生,主要是Vista,但在某些XP机器上已发生。该应用程序用VB6编写。

找到显示此行为的系统后,我在进程上运行了DebugDiag并获得了以下报告:

函数Arg1 Arg2 Arg3
0x04246c81 726c7fc8 778bf188 0012fea4
ole32!CoDisconnectObject + 55 726c7fc8 00000000 00000002
msvbvm60!BASIC_CLASS_Release + 10b2d 00000002 013e07cc 727ae518
msvbvm60!TipUnloadProject + df2 013e08dc 013e07cc 727ae470
msvbvm60!EbResetProjectNormal + 1a54 00000000 00000000 00000000

在easyjobpro__PID__5240__Date__05_18_2009__Time_09_24_01PM__619__Second_Chance_Exception_C0000005.dmp中,模块C:\ Windows \ System32 \ ole32.dll试图在线程0上写入内存位置0x726c7fc8时导致访问冲突异常(0xC0000005)

好,所以看起来是导致此问题的OLE32.dll,但是我该如何解决呢? O :-)
有没有一种方法可以获取更长的堆栈跟踪,以便实际上可以看到我的代码的哪一部分开始了这件事?它似乎与正在卸载的某个类有关(BASIC_CLASS_Release),但是如何找到哪个类呢?
谁知道为什么这可能主要在Vista上发生?
这些东西使我发疯,所以任何帮助将不胜感激。说真的,不管你在哪里,我都会给你买啤酒。 O :-)

最佳答案

退出时的GPF通常是由错误的初始化序列引起的。例如,可能发生以下情况:已经调用了一些释放所有对象的代码,现在您有了一个悬空的指针,并且当前正在执行的代码正在尝试释放同一对象。由于对象不再存在,您将获得GPF。

这种情况通常很难调试。您需要的是专用的初始化,您可以在运行程序时断开,终结,刷新,关闭等所有初始化的对象。在大多数情况下,您所需要的只是将指向对象的指针设置为Nothing-内置的资源管理将正确地初始化该对象。您必须在整个程序终止开始之前执行此代码-类似于关闭主窗口时那样。

关于exception - ole32.dll导致GPF。如何解释DebugDiag报告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/879552/

10-13 06:31