【问题标题】:Different behaviour running from command line to "Run without Debugging"从命令行运行到“无调试运行”的不同行为
【发布时间】: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


【解决方案1】:

我怀疑问题与未初始化的堆内存块有关。

在不调试的情况下启动它与将其附加到调试器并从调试器启动它的主要区别在于,在第二种情况下使用了 Windows 调试堆。

Windows 调试堆使用特定模式 (0xBAADF00D IIRC) 预先填充交给客户端的内存,并在附加调试器的情况下启动可执行文件时激活。即使它是为了使未初始化的内存错误发现更容易(因为它用“奇怪”的模式填充内存),在这种情况下它可能会掩盖你的问题,因为它只有在没有使用调试堆时才变得明显(所以未初始化的内存块可能用零填充)。

请注意,这个特定的代码块可能只是冰山一角,问题可能源自不同的位置并出现在这里。

祝你好运找到错误,这种问题也发生在我的第三方库中,尽管搜索了几天,但我不得不放弃。

(顺便说一句,Windows 调试堆与 CRT 调试堆无关,而是仅在可执行文件的调试版本中激活,并且 IIRC,它用 0xCD 模式填充内存)

【讨论】:

  • 请注意,从 VS 启动 没有 调试时,我得到了正确的行为。
  • @Anteru:没什么奇怪的,一旦我偶然发现完全相同的问题(调试堆没问题,在“正常”堆上崩溃)。这取决于哪种模式(0xBAADF00D/0xCD/0x00)更有可能使代码失败。
  • 所以即使我在 VS 内部不调试的情况下运行,我也会得到调试堆?
  • @Anteru:不,如果进程以附加的调试器启动,您将获得调试堆;抱歉,我会修正答案。
  • 确实,如果“不使用调试器运行”与正常运行相比,内存的初始化方式不同。终于弄明白了,一个变量没有正确初始化。
【解决方案2】:

看起来desc.units 没有足够的空间来容纳添加到其中的所有项目,尽管我们需要更多上下文来确定。

【讨论】:

  • 使用 desc.units.at (index++) 不会引发异常,所以没关系。它已在其他地方预填充到正确的数量。
猜你喜欢
  • 2015-11-03
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 2018-09-14
  • 2016-10-13
  • 2014-05-30
相关资源
最近更新 更多