假设我更喜欢在开发期间调试我的软件的发布版本。
这样做我可能会错过什么问题?
答案 0 :(得分:5)
在发布版本中进行了一些优化。您可以查看完整的优化列表here。他们都不应该影响该计划的结果。
如果您在任何地方都有DEBUG指令,那么它将保留。请注意这一点,因为这可能会改变整个功能。
Debug.Asserts将在调试模式下失败,但不会在发布模式下失败。
答案 1 :(得分:4)
最烦人的可能是“用于发出线程停止信号的非易失性标志在释放模式下导致死锁但在调试模式下没有”。
这经常遇到:
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
值。
答案 2 :(得分:3)
在发布中,编译器进行了一些优化。所以可能有一些你无法阅读的变量或一些内联函数。但在全球范围内,您将能够指出问题所在。
答案 3 :(得分:3)
当您尝试调试发布版本时,您可能会错过的问题并非如此,因为您无法做到或“奇怪地”工作:
答案 4 :(得分:3)
您可能会错过缓冲区溢出。调试代码在程序可用的内存周围添加填充,而发布版本则没有。因此,当您在调试版本中编写无主内存时,调试器可以检测并发出警告。在发布版本中,相同的问题可能会被忽视,直到用户输入一个崩溃所有内容的特殊输入。
使用未初始化的变量也是如此。调试版本检测到它,发布版本不会。并且这是墨菲定律,在发布之前的最后一次更改会将未初始化的变量更改为导致您决定不重新测试的部分出现问题的内容。
答案 5 :(得分:2)
预定义的调试和发布配置控制构建参数,例如DEBUG常量和代码优化。
调试条件(#IF DEBUG)的代码不会在发布模式下执行。如前所述,优化也可能隐藏变量。
可能阻止你正确调试的另一件事是pdb文件是否生成(build / advanced / debug info),如果没有,VS将无法显示你正在调试的应用程序的源代码