<分区>
我的一个程序中有一个奇怪的竞争条件,导致它仅在 Release模式和 OUTSIDE visual studio 环境中崩溃。
如果我在 visual studio 中使用 F5(发布或调试)以 Release模式启动此过程,它就可以正常工作。
如果我创建带有调试信息的发布拷贝,它不会崩溃。
我想知道如何调试这样的问题.. 为什么它不会在 visual studio 中崩溃?即使在启动可执行文件的发布版本时,visual studio 是否会降低可执行文件的速度?
<分区>
我的一个程序中有一个奇怪的竞争条件,导致它仅在 Release模式和 OUTSIDE visual studio 环境中崩溃。
如果我在 visual studio 中使用 F5(发布或调试)以 Release模式启动此过程,它就可以正常工作。
如果我创建带有调试信息的发布拷贝,它不会崩溃。
我想知道如何调试这样的问题.. 为什么它不会在 visual studio 中崩溃?即使在启动可执行文件的发布版本时,visual studio 是否会降低可执行文件的速度?
最佳答案
真正的问题是如何在不更改导致崩溃的运行时行为的情况下调试应用程序。答案是更好的事后诊断
您可以改进您的异常处理代码,如果这是一个生产应用程序,您应该这样做。
使用 std::set_terminate
安装自定义终止处理程序
如果您想在本地调试这个问题,您可以在终止处理程序中运行一个无限循环,并向控制台输出一些文本以通知您 std::terminate
已被调用。然后附加调试器并检查调用堆栈。
在生产应用程序中,您可能希望将错误报告发送回家,最好连同允许您分析问题的小型内存转储一起发送。
Microsoft 有一个结构化的异常处理机制,允许您捕获硬件和软件异常。 See MSDN .您可以使用 SEH 保护部分代码,并使用与 1) 中相同的方法来调试问题。 SEH 提供了有关发生的异常的更多信息,您可以在从生产应用发送错误报告时使用这些信息。
如果它确实是一个竞争条件,那么正确的时机是至关重要的,我想,即使在 Release 模式下附加调试器确实会改变行为,从而改变时机
关于c++ - 如何调试仅在发布版本中发生的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18483437/