Visual Studio中的“调试”和“发布”之间有什么区别?


Answers:


114

最重要的是,在调试模式下没有优化,而在发布模式下有优化。这很重要,因为编译器非常先进,可以对您的代码进行一些非常棘手的低级改进。结果,您的某些代码行可能根本没有任何指令,或者有些代码可能会混在一起。分步调试将是不可能的。另外,局部变量通常以神秘的方式进行优化,因此Watches和QuickWatches通常不起作用,因为变量已“被优化”。并且还有许多其他优化。尝试在某个时候调试优化的.NET代码,您会看到的。

另一个主要区别在于,因此,默认的Release设置不会产生大量的调试符号信息。那是您可能已经注意到的.PDB文件,它使调试器可以找出哪些汇编指令对应于哪一行代码,等等。


1
“结果是,您的某些代码行可能根本没有任何指令,或者有些代码可能混在一起”。YUP,使用堆栈框架获取当前方法/属性的名称对此犯规-并且在发布中内联了很多属性...
kpollock

4
“最重要的是,在调试模式下没有优化” –这是有争议的。最重要的是,有调试信息可让您进行调试。尽管这也可以存在于发行版中。
shoosh

我不知道哪个是默认模式(调试/发布)。通常,根据我的经验,所有项目都处于调试模式,安装程序团队将负责此发行版,以避免生成pdb文件,并进行优化。但是今天,我遇到了一种情况,该模式已更改为释放模式,并且无法使用断点来破坏代码。我花了很长时间尝试做很多事情,最后我注意到这是由于当前编译模式的问题所致。@ Vlix-感谢您的回答。
kbvishnu

1
这实际上帮助我解决了在调试符合默认Release配置的应用程序时尝试分析即时窗口中的符号时遇到的“当前上下文中不存在'变量'的名称”问题。非常感谢!
M463

1)下列问题如何处理?ASP.NET MVC项目中有3个配置:基本(web),调试(web.debug),发行版(web.release)。假设我们通过转换为相应的配置(调试和发布)来设置调试和发布连接字符串。发布时,我们可以根据在发布对话框中的选择进行发布。但是,在运行应用程序时,尽管我选择了Debug,它仍使用release config(因为我在base和debug config中设置了debug config),这正常吗?
杰森

52

实际上,“ Debug”和“ Release”只是整个设置中可能影响构建和调试的两个标签。

在“调试”模式下,通常具有以下内容:

  • 程序调试数据库文件,使您可以在运行时在源代码中密切关注程序的执行。
  • 关闭所有优化,这使您可以检查变量的值并追溯到可能已被优化或内联的函数
  • _DEBUG预处理程序定义,使您可以编写在调试模式下与发行版不同的代码,例如,对仅在调试时使用的ASSERT工具进行编码
  • 链接到还使用调试选项进行编译的库,这些库通常不部署给实际客户(出于大小和安全性的考虑)

在“发布”模式下,将启用优化(尽管有多个可用选项),并且未定义_DEBUG预处理程序定义。通常,您仍然会想要生成PDB文件,因为当事情运行得更快时,能够在发布模式下进行“调试”非常有用。


5
“仅两个标签”-实际上,Visual Studio使您能够创建更多标签在测试程序时,这可能特别有用。例如,我最近为我的工作编写了一个程序,该程序从命令行接受文件名。我测试了命令行解析,但是一旦完成,我就不想每天都搞砸CMD和文件名列表。我创建了一个配置,可以使用条件编译来提供虚拟的命令行值并测试程序的业务逻辑,从而为我加快了程序开发的迭代周期。
Brian S

9

通常,调试包含许多额外的信息,这些信息在调试时非常有用。在发布模式下,所有这些都被削减并以性能为代价。


1)下列问题如何处理?ASP.NET MVC项目中有3个配置:基本(web),调试(web.debug),发行版(web.release)。假设我们通过转换为相应的配置(调试和发布)来设置调试和发布连接字符串。发布时,我们可以根据在发布对话框中的选择进行发布。但是,在运行应用程序时,尽管我选择了Debug,它仍使用release config(因为我在base和debug config中设置了debug config),这正常吗?
杰森(Jason)

2)在“调试”或“发布”模式下运行应用程序时,VS是否使用基本Web配置或相应的Web配置(web.debug.confg或web.release.config)?
杰森(Jason)

7

如果您查看项目编译选项并进行比较,您会发现有什么区别。

假设问题是关于本机/ C ++代码的(措辞尚不完全清楚):

基本上,在“调试”中,所有代码生成优化均已关闭。一些库(例如STL)默认使用更严格的错误检查(例如调试迭代器)。会生成更多调试信息(例如,有关“编辑并继续”的信息)。代码中会生成更多东西来捕获错误(将局部变量值设置为未初始化的模式,并使用调试堆)。


2
@Vilx:当我请求时,还没有.net标记,只有visualstudio。所以我以为是C ++。
NeARAZ

6

同样,显然,调试模式会创建许多额外的线程来帮助调试。无论您是否连接调试器,它们在整个过程的生命周期中都保持活动状态。在这里查看我的相关问题。


但是仅适用于.NET(不是C ++)吗?
彼得·莫滕森

6

这也许值得一提的非常明显,即构建标志允许其不同的逻辑应该被用来只是为了改变日志和“控制台”的消息,但它可以被滥用,并极大地改变不仅仅是低的水平,但是实际的业务逻辑。


“……急剧改变……实际的业务逻辑”-对我来说似乎是个错误!我们有很多条件代码,这使得它很难理解。同样,条件代码标记的每种组合实质上都是软件的不同版本,应对其进行测试以确保正确性和基本完整性。根据我编写软件圣经的“代码完整”,我们的“首要指令”是对复杂性的管理。(这是我们要解决的第一问题)。在不加选择地添加更多条件标志之前,请三思而后行!
MicroservicesOnDDD

就最后一句话而言,我的上述评论并非特别针对此答案……这只是我认为来这里的读者应该阅读的另一件事。
MicroservicesOnDDD

6

还要注意,例如在使用MFC时,调试项目会链接到不可再MFC90D.DLL发行的DLL版本,例如while发行版会链接到可再发行的版本,例如MFC90.DLL。这可能类似于其他框架。

因此,您可能将无法在非开发计算机上运行调试构建应用程序。


非常真实 一次在客户身上犯规。在“我的机器”(TM)上工作。
马特·雅各布森

您可以分发它们。(不知道是否允许您这样做)。它们必须位于应用程序的足够名称子文件夹中。
安德里亚斯·里夫

@Andreas关于我的示例,“不可分发”表示Microsoft 不允许分发它们。
foraidt 2012年

4

当我开发从现有Release构建配置复制的应用程序时,我也对这个问题感到好奇。

我有一个开发人员,他对在调试模式下使用该应用程序很感兴趣,因此我想知道要使该构建配置具有从Release配置复制的ReleaseMyBuild名称是什么(因此应该将所有设置用于发布优化)。 ),尽管构建配置名称令人困惑,但还是突然改变了团队并成为调试构建。

我认为项目配置只是一个名称,是选择Joris Timmermans提到的“全部设置”的便捷方法。我想知道这些设置的实质内容,这些设置可以使名为“ FOO”的构建配置用作优化的发行版

这是其中的一瞥。我从Visual Studio 2010的空项目模板中创建了一个新的VCXPROJ。然后复制并进行了编辑,第一个保留调试内容,第二个保留发行内容。这是有关差异的差异...

空VCXPROJs调试与发布差异

释放

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

调试

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

有趣的是,在“链接”部分中,它们都GenerateDebugInformation设置为true。


3

您可以看到的明显区别是二进制文件的大小。调试版本比发布版本生成更大的二进制文件。

在Debug中进行编译时,将符号表添加到代码文件的已编译对象中,该代码表允许调试程序利用这些二进制文件并访问对象和变量的值。

另一个可观察到的区别是,在Release模式下,二进制文件仅会在Debug模式下发生致命错误而崩溃,如果在Visual Studio中开始调试应用程序,则可以检查调用堆栈,该堆栈告诉您错误语句的确切位置。


-15

我不知道确切的区别是什么,因为实际上没有容易获得的信息。

但是观察到的主要区别是发行版本有时会破坏生成的DLL文件,从而使您的应用程序,Web应用程序无法使用。

可悲的是,您必须将调试版本投入生产。是的,要发布,您必须使用旧的FTP。


7
这如何回答这个问题?并且在键入时请注意。
mmking

我有一个类似的问题,代码可以在调试模式下工作,但是在发布模式下却有问题。原来问题出在我的代码中。关于发行版中的常见问题,有一篇很棒的文章,希望对其他人也有帮助。
郭卫辉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.