VS6 COM 应用程序崩溃并出现潜在的内存完整性错误

Posted

技术标签:

【中文标题】VS6 COM 应用程序崩溃并出现潜在的内存完整性错误【英文标题】:VS6 COM App Crashing with Potential Memory Integrity Error 【发布时间】:2013-11-29 13:47:30 【问题描述】:

我们正在将旧的 Visual Studio 6 应用程序移植到 Windows 7。该应用程序大量使用 COM 和旧的 RogueWave 数据库接口。我们遇到了一个非常随机的服务器崩溃,看起来像是某种内存完整性问题。崩溃发生在 COM 应用程序中。该应用程序使用 COM 启动,启动后它会尝试连接到数据库。将发生以下情况之一:

1) 有时 COM 应用程序会出现服务器崩溃

2) 有时它会起作用

3) 有时它无法连接到数据库,即使重试也永远不会。

4) 有时调用 RogueWave 数据库创建时,不返回。 当连续多次启动 COM 应用程序时,它会显示任意数量的这些症状。

此时我无法确定导致不稳定的原因。

应用正常启动时也会崩溃,不使用COM,但崩溃频率较低。

之前我在该产品的另一个区域看到了具有相同症状的问题。我能够确定这些症状与对 dll 的调用有关,该 dll 返回一个作为局部变量创建的 CString。 dll 是使用 _AFXDLL 预处理器定义构建的。删除对该 dll 的调用后,不再出现此问题。这个问题在很多地方都出现过。

起初我认为这个问题是因为 dll 不是作为 AFX EXTENSION DLL 构建的,但在阅读文档后,_AFXDLL 预处理器定义也会将 dll 构建为 AFX_EXTENSION_DLL。我习惯于使用 _AFXEXT 预处理器指令来构建 AFX_EXTENSION dll。

现在崩溃的 COM 应用程序不使用此 DLL。 COM 应用程序使用的另一个 DLL 具有 1 个导出函数,该函数返回创建为局部变量的 CString。在数据库连接期间不调用此导出函数。

有人知道什么会导致 COM 应用程序中出现这种明显的内存完整性崩溃吗?提前感谢您的帮助。

【问题讨论】:

这是潜在堆损坏的通用 bat 信号。有工具可以帮助您诊断它,您需要去购物。当您的编译器和库如此古老而问题被忽略了这么久时,您的购物清单很艰难。 【参考方案1】:

这原来是由 Oracle 10g express 客户端 dll 中的错误引起的。

【讨论】:

以上是关于VS6 COM 应用程序崩溃并出现潜在的内存完整性错误的主要内容,如果未能解决你的问题,请参考以下文章

VS2005:如何像 VS6 一样编译项目?

潜在的弹簧安全内存泄漏

xib中关于拖拽手势的潜在错误

在 MFC 应用程序中托管 Windows 窗体 (C#) (VC++,VS6.0)

iOS - XCode 4.4 - 使用分析的潜在内存泄漏

UITableView reloadData在iOS 11中重新出现时崩溃