【问题标题】:Microsoft Visual Studio: Debug dll gets used by a binary built in release modeMicrosoft Visual Studio:调试 dll 被内置发布模式的二进制文件使用
【发布时间】:2011-06-21 11:44:12
【问题描述】:

在我的 Visual Studio 2008 项目中,活动配置是 Release,并且在 Compiler 和 Linker 设置中没有启用调试符号。我正在从命令提示符构建一个 exe 文件:

devenv standalone_cpp.sln /build "RELEASE|WIN32"

没有理由在运行时使用调试 dll MSVCR90d.dll,但它确实会崩溃。我不知道为什么只有调试 dll 被拾取而不是发布 dll MSVCR90.dll。有人可以帮忙吗?

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

【问题讨论】:

    标签: debugging dll build release


    【解决方案1】:

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

    我遇到过这种情况——它表现出像这样的神秘行为,尽管我也看到它在链接大型 DLL/EXE 时表现出奇怪的“内部错误”,有时编译非常大或非常大的项目翻译单位。出于某种原因,重新安装服务包起作用了。

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

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

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

    请记住,MSVS2008 将使用Tools==>Options 中的设置“覆盖”任何项目/解决方案设置,即使您是从命令行构建的。检查那里没有设置调试路径来链接你的发布目标。 (这是 Microsoft 的一个错误决定,因为它导致项目/解决方案文件无法描述实际发生的情况,他们在 MSVS2010 中删除了该“功能”。)

    你也可以看看:

    【讨论】:

      【解决方案2】:

      我认为@Charley 很赚钱。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 2012-01-15
        • 1970-01-01
        • 2010-10-26
        相关资源
        最近更新 更多