我的程序在某个奇怪的竞态条件下崩溃,但只在发布模式和Visual Studio外部环境下发生。
如果我使用F5在Visual Studio中以发布或调试模式启动此进程,则正常工作。
如果我创建带有调试信息的发布版本,则不会崩溃。
我想知道如何调试这样的问题...为什么在Visual Studio内部没有崩溃?即使使用发布版本,Visual Studio是否会减慢可执行文件的运行速度?
我的程序在某个奇怪的竞态条件下崩溃,但只在发布模式和Visual Studio外部环境下发生。
如果我使用F5在Visual Studio中以发布或调试模式启动此进程,则正常工作。
如果我创建带有调试信息的发布版本,则不会崩溃。
我想知道如何调试这样的问题...为什么在Visual Studio内部没有崩溃?即使使用发布版本,Visual Studio是否会减慢可执行文件的运行速度?
使用std::set_terminate
安装自定义终止处理程序。
如果您想在本地调试此问题,可以在终止处理程序内运行一个无限循环,并将一些文本输出到控制台以通知您已调用std::terminate
。然后附加调试器并检查调用堆栈。
在生产应用程序中,您可能希望发送错误报告回家,最好附带允许您分析问题的小型内存转储。
Microsoft拥有结构化异常处理机制,允许您捕获硬件和软件异常。请参阅MSDN。您可以使用SEH保护代码的某些部分,并使用与1)相同的方法来调试问题。 SEH提供了有关发生的异常的更多信息,您可以在从生产应用程序发送错误报告时使用。
如果确实是竞争条件,则正确的时间非常重要,我想,即使在发布模式下附加调试器也会改变行为,从而改变时间
很不幸,这些问题往往很难调试。我发现有用的一件事是存储“我去过哪里”的值数组(数组越简单越好 - 所以整数值,或小字符串,或其他什么),而不是每次都打印一些东西。如果您可以在调试器中停止或以某种方式检测到崩溃,则可以转储“跟踪”,并查看如何到达当前位置以及涉及哪些线程。
Sleep()
函数的调用。