【发布时间】:2023-04-07 10:32:01
【问题描述】:
在这里摸不着头脑:如果从 Visual Studio 2010 启动,我有一个在 Debug+Release 中运行良好的应用程序,无论是在调试还是在“不调试的情况下运行”。如果我从命令行运行相同的应用程序,使用相同的设置,我会看到不同的行为。特别是运行方式不同的代码是:
const List& vl = nDesc.Get<List> ("slots");
int index = 0;
for (auto it = vl.begin (), end = vl.end (); it != end; ++it)
{
desc.units [index++] = Parse (Tree (*it));
// If I access it again here, e.g.
// Log::Info (std::distance (vl.begin (), it))
// this works always
}
我会假设这是一个竞争条件,但代码是完全单线程的。有趣的是,添加一些随机代码并不能使其工作(即仅记录一个字符串是不够的。)哦,这个循环永远只运行一次。
desc 中的数据是相同的,在循环显示相同的数据已写入后将其转储到文件中。在那段代码中上下移动循环并没有帮助。将 auto 更改为 List::const_iterator 也没有帮助。
任何想法从哪里开始调试?
[更新] 禁用此函数的优化并不能修复它的发布,但我可以附加调试器并查看其中的所有内容都按预期工作。但是我没有得到正确的程序行为。 Stills 也适用于“Run without Debugging”和“Run with Debug”。
【问题讨论】:
-
如果不调试就启动,稍后再附加调试器,会出现bug吗?
-
是的,看起来是这样。有趣,让我们看看是否有帮助。
-
这不一定与这段代码有关 - 它可能是覆盖这段代码使用的内存的其他东西。 cmd 与 VS 的最大区别在于环境、路径和命令行参数 - 检查这些
-
命令行和启动文件夹完全一样。 “不调试启动”和真正的发布模式还有什么区别?
标签: c++ visual-studio-2010 debugging