Microsoft Visual Studio:Debug dll由内置于发布模式的二进制文件使用

时间:2011-06-21 11:44:13

标签: debugging dll build release

在我的Visual Studio 2008项目中,活动配置为Release,并且在编译器和链接器设置中未启用调试符号。我正在从命令提示符构建一个exe文件:

devenv standalone_cpp.sln /build "RELEASE|WIN32"

没有理由在运行时使用调试dll MSVCR90d.dll,但它会崩溃。我没有丝毫的线索,为什么只有调试dll被拾取而不是释放DLL MSVCR90.dll。有人可以帮忙吗?

我甚至尝试在调试模式下构建我的.exe,希望它不会崩溃,但仍然会因为相同的断言失败而崩溃_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)。在我开枪之前请帮忙。

2 个答案:

答案 0 :(得分:1)

重新安装MSVS2008 Service Pack 1. 您的安装似乎已损坏。

我已经发生了这种情况 - 它表现出像这样的神秘行为,虽然我也看到它在链接大型DLL / EXE时出现奇怪的“内部错误”,有时编译非常大的项目,或者非常大翻译单位。出于某种原因,重新安装Service Pack有效。

以下是一个快速链接:http://www.microsoft.com/downloads/en/details.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E&displaylang=en

另一个想法可能是您已将链接调试链接到您的发布可执行文件中。即使您为“RELEASE|WIN32”构建了解决方案,如果任何先决条件(链接库)是调试版本(直接引用*.lib,或者引用了调试路径而不是发布路径) ,你最终会得到那个混合,并且该DLL的“调试”版本会尝试加载。

然后,它崩溃的原因可能是你在“发布”模块中分配并在“调试”模块中删除(反之亦然)。这是行不通的,因为分配器是不同的(因为“调试”版本为标记和其他“调试检查”分配了额外的状态)。

请记住,即使您从命令行构建,MSVS2008也会“覆盖”Tools==>Options中找到的任何项目/解决方案设置。检查是否没有为发布目标中的链接设置调试路径。 (这是微软做出的错误决定,因为它导致项目/解决方案文件没有描述实际发生的事情,他们删除了MSVS2010中的“功能”。)

您可能还会看一下:

答案 1 :(得分:0)

我认为@Charley是有钱的。

下载Dependency Walker并查看实际导致调试DLL加载的原因。如果你在问题中说的是正确的,那么它可能是你所依赖的另一个库。