Visual Studio 项目对程序的发布和调试版本分别有单独的配置。顾名思义,生成调试版本的目的是用于调试,而生成发布版本的目的是用于版本的最终分发。
如果在 Visual Studio 中创建程序,Visual Studio 将自动创建这些配置并设置适当的默认选项和其他设置。在默认设置下:
- 程序的“调试”配置用全部符号调试信息编译,不进行优化。(优化会使调试复杂化,因为源代码和生成的指令间的关系更加复杂。)
- 程序的“发布”配置被完全优化,不包含任何符号调试信息。调试信息可在单独的 PDB 文件中生成。
当在程序集的属性页中选Debug模式时,配置如下:
本文地址:http://www.cnblogs.com/Interkey/p/3554588.html
当选择Release模式时,配置如下:
两者的不同点如下:
项目 | Debug | Release |
条件编译常数 | Debug;Trace | Trace |
优化代码 | False | True |
输出路径 | bin/Debug | bin/Release |
生成调试信息 | True | False |
Debug模式下生成的程序集为调试版本,未经优化;在bin/debug/目录中有两个文件,除了要生成的.exe或.dll文件外,还有个.pdb文件,这个.pdb文件中就记录了代码中的断点等调试信息;
Release模式下不包含调试信息,并对代码进行了优化,/bin/release/目录下只有一个.exe或.dll文件。
注意: 若要更改项目的生成模式,不能只从项目属性页上点“配置”下拉框更改,那样不起作用,必须点右上角的“配置管理器”按钮才能更改。
另外,在项目文件夹下除了bin外,还有个obj目录,由于编译是分模块编译的,每个模块的编译结果就保存在了obj目录下。最后会合并为一个exe或者dll文件保存到bin之中。因为每次编译都是增量编译,也就是只重新编译改变了的模块,所以这个obj的目录的作用就是保存这些小块的编译结果,加快编译速度。
以上内容整理自:VS.Net中程序集的Debug版本和Release版本的区别.
更多可参考:判断dll是debug还是release,这是个问题
然后就是关于pdb文件:
程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。 在使用 /debug 生成时,会创建一个 PDB 文件。 可以使用 /debug:full 或 /debug:pdbonly 生成应用程序。 使用 /debug:full 生成将产生可调试的代码。 使用 /debug:pdbonly 生成将产生 PDB,但是不会产生通知 JIT 编译器调试信息可用的 DebuggableAttribute。 如果您想为不希望其成为可调试的发布版本生成 PDB,请使用 /debug:pdbonly。 有关更多信息,请参见 /debug (C# 编译器选项)或 /debug (Visual Basic)。
问:Debug里有pdb,Release里也有pdb,他们有什么不同呢?为什么很多人都不喜欢pdb,欲除之而后快?
答:Debug里的pdb是full,保存着调试和项目状态信息、有断言、堆栈检查等代码。Release 里的pdb是pdb-only,基本上:出什么错了+错误在哪行。
因为很多人把pdb理解成:调试文件、Program Debug Database、会泄露代码机密,所以想将其删除,那只要在VS的 项目-->生成-->高级-->调试信息-->None便可.
重要事项: 调试器只会为二进制文件加载与该二进制文件生成之时所创建的 PDB 完全相符的 PDB。 就是说,该 PDB 必须是原 PDB 或其副本。 因为编译器在创建二进制文件时会考虑多种因素,所以,即使代码自身没有变化,二进制文件的实际布局也可能会有变化。
以上内容整理自:.net里Release的pdb文件有什么用
扩展:Determining if a .NET Assembly is compiled debug or not