繁体   English   中英

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

[英]Visual Studio c++ - program fails without debugger, works fine with debugger

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

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

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

有一次,我调用了一个 function 来设置一个名为currCode的变量(一个整数)

currCode = function();
//this throws debug error

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

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

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

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

  1. 未初始化的变量
  2. DLL 地狱
  3. 定时
  4. 堆或堆栈管理

同样,以上是最常见的。

未初始化的变量

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

DLL 地狱

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

定时

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

堆或堆栈管理

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM