我的应用(EasyJob)会在退出时导致访问冲突错误。这只发生在一些系统上,主要是Vista,但它发生在一些XP盒子上。该应用程序是用VB6编写的。
找到显示此行为的系统后,我在我的进程上运行了DebugDiag并获得了此报告:
Function 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导致这个,但我该如何解决?其他:-)
有没有办法获得更长的堆栈跟踪,这样我才能真正看到我的代码的哪一部分启动了这个东西?它似乎与某些类被卸载(BASIC_CLASS_Release)有关,但我如何找出哪一个?
有人知道为什么这可能主要发生在Vista上吗?
这些东西让我疯了,所以任何帮助都会非常感激。说真的,无论你身在何处,我都会给你买啤酒。 ○: - )
答案 0 :(得分:2)
退出时的GPF通常是由错误的取消初始化序列引起的。例如,可能发生了以下情况:已经调用了一些释放所有对象的代码,现在你有一个悬空指针,当前正在执行的代码试图释放同一个对象。由于该对象不再存在,您将获得GPF。
这种情况通常难以调试。您需要的是专用的取消初始化,您可以断开,完成,刷新,关闭等运行程序时初始化的所有对象。在大多数情况下,您只需要将对象设置为Nothing
的对象 - 内置资源管理将使对象正确地取消初始化。您必须在整个程序终止开始之前执行此代码 - 就像关闭主窗口时那样。
答案 1 :(得分:2)
我发现在这些情况下,它通常是VB Forms引用的对象。如果在Unload事件中将Form的变量设置为Nothing,并确保在使用表单后或在应用程序关闭之前调用Unload,则GPF将消失。
答案 2 :(得分:2)
您可以尝试使用John Robbins'Crashfinder来查看十六进制地址(0x04246c81)是否与您自己的任何代码相对应。可能会告诉您涉及哪些对象的线索。使用调试信息构建应用程序以创建PDB。然后使用新应用程序再次重现错误(因为PDB信息将更改exe中的十六进制地址)。
Crashfinder.exe位于此self-extracting ZIP中。 Do File-New创建一个新项目,然后编辑 - 添加图像以加载你的exe。然后编辑 - 查找崩溃并输入新的十六进制地址。它将告诉您与十六进制地址对应的源文件和例程(如果它在您自己的代码中)。