Visual Studio c ++ - 程序在没有调试器的情况下失败,与调试器一起工作正常

时间:2011-07-14 19:42:35

标签: c++

我的程序在运行调试器时完全按照需要执行,即使没有断点

当我在没有调试的情况下运行时,我收到调试错误

  

“此应用程序已请求Runtime以不寻常的方式终止它。”

有一次,我调用一个设置名为currCode(整数)

的变量的函数
currCode = function();
//this throws debug error

如果我在这一行和下一行之间添加变量currCode的cout,程序在有或没有调试器的情况下都能正常工作。

currCode = function();
cout << currCode; //this works!

2 个答案:

答案 0 :(得分:1)

可能会尝试关闭优化,看看你是否仍然遇到问题。

答案 1 :(得分:1)

直接从可执行文件运行的程序和调试程序运行的程序中出现错误的原因很多。以下是一些常见的内容:

  1. 未初始化的变量
  2. DLL Hell
  3. 时序
  4. 堆或堆栈管理
  5. 同样,以上是最常见的。

    未初始化的变量

    许多调试器会无意中为您初始化变量。直接从可执行文件运行的程序可能无法按照您期望的方式初始化变量区域。在嵌入式系统领域,这通常意味着根本没有。 因此,养成初始化所有变量的习惯,最好是在声明它们时。

    DLL Hell

    调试器很好,希望为您提供良好的体验,因此在执行程序之前,它们会加载许多共享或动态链接的库。您必须明确加载其中一些库。

    时序

    通常不常见,但在没有调试器的情况下执行的程序运行速度与使用调试器全速运行的程序不同。这可以使延迟循环(自旋循环)具有不同的。使用调试器时,数据缓冲区可以有更长的时间来填充。如有疑问,请在发布版本中使用print语句来缩小问题的位置。

    堆或堆栈管理

    调试器通常提供代码来保护程序免于超出堆栈,堆和其他内存区域。它具有检测野指针和从无效地址访问数据的功能。此外,调试器希望保护操作系统给予他们的小内存(他们必须与您的程序共享内存)。在没有调试器的情况下运行的程序可能会在没有任何检测或生成错误的情况下搞乱堆栈和堆。