1

简介:
我正在重构win32应用程序,我使用VS 2008。该应用程序由我自己的dll和第三方dll组成。

问题:
当我在调试模式下运行应用程序并执行某些操作时,会引发错误:应用程序已触发断点,堆已损坏。

采取的措施:
我在网上搜索了这个错误,发现这个错误可能是因为项目中的 dll 使用了不同的构建标志(多线程调试/MD和多线程调试 dll /MDd)(这导致他们使用不同的 c 运行时库,并且为每个库维护自己的内存使用列表,因此可能导致堆损坏)。我检查了我的 dll - 它们都有相同的标志:调试多线程 dll。所以我认为第三方 DLL 之一可能是用多线程调试标志构建的。

问题:

  • 是否有可能找出构建了哪个标志 3-rd 方库,如果可以,我该怎么做。
  • 我如何对您的不同构建标志问题进行分类?
  • 我对该错误的猜测是由于不同的构建标志是正确的吗?
4

1 回答 1

3

是否可以找出构建了什么标志 3-rd 方库,如果可以,我该怎么做

是的。使用 Visual Studio 版本 2005 和 2008 构建的 C 或 C++ DLL 需要一个清单,说明它们需要哪个版本的 C 运行时 DLL。你可以用VS看到它,File + Open + File,选择DLL并打开标有“RT_MANIFEST”的节点。资源 ID 2 是说明 CRT 类型和版本的清单。它应该与您的匹配。将其导出以使其更易于阅读。如果它丢失了,那么它要么不是用 /MD 构建的,要么是使用了完全不同的 VS 版本,这本身就是个坏消息。

我如何对您的不同构建标志问题进行分类?

你不能。您需要联系第 3 方并请求与您兼容的构建。

我对该错误的猜测是由于不同的构建标志是正确的吗?

这是可能的,但可能性不大。不匹配不会自动导致崩溃,程序员当然可以设计 DLL 接口,这样就不会出现问题。您通常可以从函数签名和文档中看出。问题案例是 DLL 分配对象并且您应该释放它的位置。当函数返回一个指针时,这将是显而易见的。或标准 C++ 类库对象,如 std::string。不太明显的是它何时抛出异常。这样的问题也是高度可重复的,它会持续轰炸,而不是偶尔轰炸。

你犯的最大错误是在这里问这个问题。您应该与从事此 DLL 工作的第 3 方雇用的程序员交谈。他会知道您的问题的确切答案,并且可以很容易地解决您的问题。如果你不能得到这种支持,那么你应该使用这些 DLL,它们会让你的生活在很长一段时间内都很痛苦。

于 2013-04-24T10:16:29.113 回答