VB6程序崩溃:第2部分。修复访问冲突的建议(0xC00000005)

时间:2008-12-03 16:46:12

标签: vb6 crash

this question相关。有关解决问题的建议吗?

经过大量的程序试验,我发现了几件事。

  1. 在运行代码行Set Message = New CAPICOM.EncryptedData时,它会相对一致地崩溃(90%的时间左右)。请注意,此行上方的行仅为Dim Message As CAPICOM.EncryptedData

  2. 在程序执行前面调用时,调用该函数的函数不会崩溃。二进制搜索错误无法找到问题,因为在某些地方神秘地调用函数,不可靠地防止错误发生。如果错误出现,有时重建程序似乎会产生影响。是的,这是一个heisenbug。相同的问题适用于时间二进制搜索错误。花费5个小时比较两个版本的程序只发现两个版本都有错误,即使其中只有一个当前显示症状的效率不高。

  3. 崩溃是由于访问冲突0xC00000005

  4. 造成的
  5. 运行WinDbg(Windows调试器)显示只有一行代码读取此内存位置LoadPicture(szTmpBMP)。它在一个可怕的函数结束时被调用,该函数从资源中抓取图片并将其粘贴在临时文件中。我很害怕这个函数,为了测试,我用调用LoadPicture("testcra.bmp")替换它,然后没有为该位图调用可怕的资源函数。这没有用。完全删除对loadpicture的调用也无济于事,尽管调试器无法再找到受影响的内存被读取的任何点,并且受影响的内存不再位于同一位置。此测试是在VM上完成的,因此一些内存读取不一定对调试器可见。

  6. 一切都在Vista上完美运行(我的本地机器和Vista VM)。访问冲突仅发生在XP上。

  7. 我正在使用VB6版本8176,6.0.8169

1 个答案:

答案 0 :(得分:0)

我当前的解决方案是,尽早创建我的所有capicom对象,并且永远不会创建超出第一个的capicom.encrypteddata的新实例。这有效,但基本问题不太可能实际修复。