C++ 由于msvcp120d.dll,发布版本崩溃

C++ 由于msvcp120d.dll,发布版本崩溃,c++,debugging,visual-studio-2013,release,C++,Debugging,Visual Studio 2013,Release,我的代码在版本配置中崩溃,但在调试配置中没有。它只是在最后一行“return(0);”退出程序时才这样做执行。我在VisualStudio开发环境中工作,当它崩溃时,VS Studio为我提供了“调试”代码的选项。当我选择该选项时,会弹出一个错误对话框,上面说: myapp.exe中0x00007FF851A0512D(msvcp120d.dll)处未处理的异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFF 当我选择在发生此异常时“中断”时,它会突出显示xstring文件中的以

我的代码在版本配置中崩溃,但在调试配置中没有。它只是在最后一行“return(0);”退出程序时才这样做执行。我在VisualStudio开发环境中工作,当它崩溃时,VS Studio为我提供了“调试”代码的选项。当我选择该选项时,会弹出一个错误对话框,上面说:

myapp.exe中0x00007FF851A0512D(msvcp120d.dll)处未处理的异常:0xC0000005:访问冲突读取位置0xFFFFFFFFFF

当我选择在发生此异常时“中断”时,它会突出显示xstring文件中的以下函数:

void _Free_proxy()
    {   // destroy proxy
    typename _Alloc::template rebind<_Container_proxy>::other
        _Alproxy;
    this->_Orphan_all();
    _Alproxy.destroy(this->_Myproxy);
    _Alproxy.deallocate(this->_Myproxy, 1);
    this->_Myproxy = 0;
    }
void\u Free\u proxy()
{//销毁代理
typename\u Alloc::模板重新绑定::其他
_阿普罗西;
这是一个孤儿;
_Alproxy.destroy(此->我的代理);
_Alproxy.解除分配(本->我的代理,1);
这个->\u Myproxy=0;
}
尤其是行“\u Alproxy.destroy(this->\u Myproxy);”被强调为罪魁祸首

我认为问题可能是我的“发布”代码以某种方式链接到“调试”msvcp120d.dll库,因为在弹出的第一个对话框中突出显示了该库-但这可能只是因为我开始使用VS调试器来识别此问题。但即使这是问题所在,我也不确定如何告诉VS使用msvcp120.dll编译发布配置,使用msvcp120d.dll编译调试配置

(作为记录,我正在使用发布配置中的“多线程DLL(/MD)”标志和调试配置中的“多线程调试DLL(/MDd)”生成所有代码)

更重要的是,当发布版本崩溃时,进程进入“暂停”状态,我无法通过任务管理器完全杀死它。然后我甚至不能重新编译一个新的发行版本,而不重新启动我的电脑

我不知道如何隔离这个问题。有谁能给我建议我该如何解决这个问题吗


更新

这个项目的代码相当大——因此,将其提取到表现出相同行为的最小版本(虽然通常是跟踪bug的有效方法)将是一项相当大的任务。我希望有某种方法来记录进程,并找出哪个进程调用msvcp120d.dll@Niall,我生成了依赖关系图,它非常庞大。在不泄露任何专有信息的情况下,随附的是图形的全局视图。

是否有任何工具可以跟踪调用msvcp120d.dll的对象?

@n谢谢!Dependencywalker.com上的软件非常棒。我能够使用它来确定导致问题的库并跟踪错误。事实证明,我之前(几个月前,沉默地)设置了该库调试版本的系统路径。因此,即使我的项目被正确地定向到库的发布版本,在运行时,我的可执行文件仍链接到*.dll文件的调试版本

我删除了path变量,现在确保适当的*.dll文件的副本在我的发行版或调试目录中。然后一切正常运行和关闭


感谢所有提供帮助的人。

听起来您的代码中有未定义的行为。您是否可以在发布版本中添加相同的行为?您或者msvcp120d.dll(运行时的调试版本)中的某个依赖项链接。混合运行时可能会导致这样的问题。要跟踪谁,可以使用Dependency Walker列出依赖项树。msvcp120d.dll是Visual Studio 2013调试crt的一部分。如果在发行版中使用,我希望使用UB,因为调试和发行版运行时彼此不兼容。确保您的应用程序和所有从属DLL构建在同一配置中。混合使用编译器版本也是不安全的。您的程序正在破坏堆。看到进程中加载了msvcp120d.dll实际上可以保证会发生这种情况。基本的C++模板类对象,如STD::string在调试和发布构建中没有相同的布局。这不是Java或C#与VM一起运行以确保每个人都同意对象的外观。在C++中,你必须构建你链接的所有东西,包括你没有建立自己的库,使用完全相同的编译器使用完全相同的设置。我不认识这个图,但这是我正在谈论的工具。