在发布模式下未正确执行相同的操作

时间:2017-01-06 00:31:31

标签: c++ visual-c++ visual-studio-2015

我正在使用VS2015。

在调试模式下突出显示,循环工作正常 - 当!P_Object->first_request为真时,它会中断 但是相同的条件在发布模式下不起作用。此外,在quickwatch中,您可以看到visual studio quickwatch将!P_Object->first_request识别为false,但循环继续重复。

BTW:P_Object->first_request变量在类中初始化为false并在线程中更改为true(可能此信息有用 - idk)。

enter image description here

如何修复此错误?

DEBUG Command line - "/GS /analyze- /W3 /Zc:wchar_t /I"C:\boost_1_62_0" /ZI /Gm /Od /Fd"Debug\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "WIN32_LEAN_AND_MEAN_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MTd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\ExpenditureAndReceipts.pch"";

RELEASE Command line - "/GS /analyze- /W3 /Gy /Zc:wchar_t /I"C:\boost_1_62_0" /Zi /Gm- /O2 /Fd"Release\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "WIN32_LEAN_AND_MEANNDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\ExpenditureAndReceipts.pch"";

2 个答案:

答案 0 :(得分:3)

你不能在一个线程中读取bool并将其写入另一个线程中。编译器可以自由地将读取缓存在第一个线程中,并且永远不会读取内存更改。

如果您正在编写多线程编程,请通过原子和互斥体等进行通信。

first_request替换为std::atomic<bool>。这可能需要更改其他代码。完成后,事情应该是好的。

你做了什么(在一个线程中读取,在另一个线程中写入,没有同步)是未定义的行为。未定义的行为并不总是崩溃,有时只会导致发布版本没有意义。

答案 1 :(得分:-1)

基本上只有一个发布版本的bug必须像其他任何bug一样处理,除非你没有机器可以帮助你。 将应用程序减少到“Hello World” - 提供一些输出并关闭而没有错误的东西。然后将整个应用程序重新放入,并添加一个切换按钮,以便您可以在无错误的“Hello world”版本和带有几次击键的错误版本之间切换。

现在为Hello World版本添加功能并将其从完整版本中取出(当然,保留完整版本)。尝试隔离出现错误的位置,这样您就可以通过几次击键在无错误,轻微损坏和错误版本之间切换。

这经常揭示错误。如果没有,请开始使用该信息放入诊断printf(启动并运行调试控制台,以便您可以看到stdout)。

释放零初始化使用malloc()分配的内存,断言是不同的,还有许多其他小的变化。有一个只发布的错误并不常见,虽然它当然会使调试模式毫无意义。