调试发布版本而不是调试版本可能会遗漏哪些问题
本文关键字:版本 调试 问题 布版本 | 更新日期: 2023-09-27 18:17:34
假设我更喜欢在开发过程中调试我的软件的发布版本。
这样做可能会遗漏哪些问题?
-
在发布版本中进行了一些优化。您可以在这里看到完整的优化列表。它们都不应该影响程序的结果。
-
如果你在任何地方有DEBUG指令,它将留在。
-
调试。
可能最令人讨厌的是"非易失性标志,用于通知线程停止,导致在释放模式下死锁,但在调试模式下不会"。
通常为:
flag = false;
Thread t = new Thread(
o =>
{
while(!flag)
{
// do stuff
}
});
t.Start();
// main thread does some work
flag = true;
t.Join(); // will never return in release mode if flag is not volatile
这是因为编译器在发布模式下进行了优化,因为flag
变量被线程t
的核心缓存,因此它无法看到flag
的更新值。
您可能会错过缓冲区溢出。调试代码会在程序可用的内存周围添加填充,而发布版本则不会。因此,当您在调试构建中写入无主内存时,调试器可以检测并发出警告。在发布版本中,同样的问题可能不会被注意到,直到用户输入一个特殊的输入,导致一切崩溃。
使用未初始化的变量也是如此。调试版本会检测到它,而发布版本则不会。根据墨菲定律,发布前的最后一次更改会将未初始化的变量更改为导致您决定不重新测试的部分出现问题的内容。
在发布中,编译器做了一些优化。所以可能有一些变量你无法读取或者一些内联函数。但是全局来说,你可以指出问题在哪里
当你试着调试一个发布版本时,你可能会错过那么多的问题,因为你不能做的事情或"奇怪地"工作:
- 一些变量可能被优化掉了,所以你不能检查它们
- 属性和/或方法可以内联,以便丢失代码位置
预定义的调试和发布配置控制构建参数,如debug常量和代码优化。
为调试条件(#IF debug)的代码将不会在发布模式下执行。如前所述,优化也可能隐藏变量。
另一件可能阻止你正确调试的事情是pdb文件是否生成(构建/高级/调试信息),如果没有,VS将无法显示你正在调试的应用程序的源代码。