2011-06-09 134 views
2

我有一个应用程序,一旦编译运行完全正常。但是,如果我在VB6环境中启动它,它会不断地和非常随机地崩溃IDE,但只有当我对应用程序采取行动时(例如,将鼠标移动到其上,点击某物,移动窗口等)。如何调试VB6崩溃?

该应用程序做了许多与VB6无关的事情:SIP,虚拟声卡接口,音频编码/解码等等......所以它可能是这样的,但是崩溃似乎是随机的。

崩溃总是发生在vba6.dll模块中(至少这就是崩溃对话框所说的)。鉴于MS不再支持VB6,我能做些什么来调试它?

我已经在XP和Win7上试了它,得到了相同的结果。

+0

我想你已经应用VB6服务包6?在VB6进程中是否存在可能造成危害的“外来”或未知DLL,如防病毒,附加组件,第三方等? – 2011-06-09 04:59:02

+0

@Simon Mourier是的,VB6 SP6。是的,一堆第三方组件。 – AngryHacker 2011-06-09 05:34:55

+0

也许你可以尝试一个全新的安装只有VB6,如果可能的话 – 2011-06-09 05:42:31

回答

3

很可能某些API/DLL函数与VB IDE不兼容。我们有时为IDE和EXE编写不同的代码,我们的Windows子类化和API绘图函数也位于另一个dll(或ocx)中以避免崩溃。另外我们在我们的软件中使用了GPF处理程序(SetUnhandledExceptionFilter和相关的API函数),但是这仅在EXE中打开 - 无论如何在IDE中都不起作用。我们的GPF大多发生在EXE中:)

对于调试,您可以排除一些代码路径,特别是与Windows消息/子类化,全局钩子,绘图和API回调相关的代码路径。你可以安装一些更好的调试器(甚至VC可用)来查看调用堆栈 - 有时这包括系统函数名称,暗示错误操作。

+0

阿沃的基本上是正确的。从描述来看,这听起来像是一个内存破坏问题,只是以一种明显的“随机”方式抛弃了堆栈。当在IDE中时,垃圾堆栈在编译时会更麻烦。我以前有过这些,他们可能非常难以追捕。禁用代码路径,大量日志记录,这可能是你最好的选择。 – DarinH 2011-06-09 17:03:37

+1

我忘了大量的日志,感谢提示!对于日志记录,你应该确保日志文件在每次写入后立即关闭并刷新到磁盘,否则你可能(并且确实)会丢失最后一个更有趣的条目。 – Arvo 2011-06-10 06:48:30