Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从命令行到";“不调试运行”;_C++_Visual Studio 2010_Debugging - Fatal编程技术网

C++ 从命令行到";“不调试运行”;

C++ 从命令行到";“不调试运行”;,c++,visual-studio-2010,debugging,C++,Visual Studio 2010,Debugging,这里让我摸不着头脑:我有一个应用程序,如果从VisualStudio2010启动,它在Debug+版本中运行良好,无论是在Debug中还是在“未调试的情况下运行”。如果我使用相同的设置从命令行运行相同的应用程序,我会看到不同的行为。具体而言,运行方式不同的代码是: const List& vl = nDesc.Get<List> ("slots"); int index = 0; for (auto it = vl.begin (), end = vl.end (); it

这里让我摸不着头脑:我有一个应用程序,如果从VisualStudio2010启动,它在Debug+版本中运行良好,无论是在Debug中还是在“未调试的情况下运行”。如果我使用相同的设置从命令行运行相同的应用程序,我会看到不同的行为。具体而言,运行方式不同的代码是:

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
}
const List&vl=nDesc.Get(“插槽”);
int指数=0;
for(auto it=vl.begin(),end=vl.end();it!=end;++it)
{
desc.units[index++]=Parse(Tree(*it));
//如果我在这里再次访问它,例如。
//日志::信息(标准::距离(vl.begin(),it))
//这总是有效的
}
我假设这是一个竞争条件,但代码是完全单线程的。有趣的是,添加一些随机代码并不能使它工作(即仅仅记录一个字符串是不够的。)哦,这个循环只运行一次,永远不会

desc中的数据是相同的,在循环显示相同的数据已被写入后将其转储到文件中。在那段代码中上下移动循环没有帮助;将auto更改为List::const_迭代器也没有帮助

你知道从哪里开始调试这个吗


[更新]禁用此函数的优化并不能修复其发布版本,但我可以附加调试器,并查看其中的所有内容是否按预期工作。但是我没有得到正确的程序行为。Stills也可以与“不调试运行”和“调试运行”一起使用。

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

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

在不进行调试的情况下启动它与将其附加到调试器以及从调试器启动它之间的主要区别在于,在第二种情况下使用Windows调试堆

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

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

幸运的是找到了这个bug,我在第三方图书馆也遇到了同样的问题,尽管搜索了几天,我还是不得不放弃


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

如果您在不调试的情况下启动它并在以后附加调试程序,是否会出现错误?是的,似乎是这样。有趣的是,让我们看看这是否有帮助。这不一定与这段代码有任何关系-它可能是其他东西覆盖了这段代码使用的内存。cmd与vs的最大区别在于环境、路径和命令行参数-检查这些命令行和启动文件夹是否完全相同。“无调试启动”和真实发布模式之间还有什么区别吗?请注意,当我从VS@Anteru开始无调试启动时,我得到了正确的行为。没有什么奇怪的,当我遇到完全相同的问题时(调试堆正常,堆崩溃)。这取决于哪个模式(0xBAADF00D/0xCD/0x00)更有可能使代码失败。因此,即使我在VS中运行而不进行调试,我也会得到调试堆?@Anteru:不,如果进程是在附加了调试程序的情况下启动的,则会得到调试堆;很抱歉,我会解决这个问题。事实上,如果“不使用调试器运行”与正常运行相比,内存初始化是不同的。最终发现,变量没有正确初始化。使用desc.units.at(index++)不会引发异常,所以这没问题。它在别处被预先填充到正确的数量。