构建时间改进建议:关闭/MAP,使用PDB

[原文发表地址] https://blogs.msdn.microsoft.com/vcblog/2018/03/14/build-time-improvement-recommendation-turn-off-map-use-pdbs/

[原文作者] YongKang Zhu [MSFT]

[原文发表时间] 3/14/2018

映射文件是一个纯文本文件,其中包含有关链接器生成的二进制文件中存在的某些名称和符号的信息。它还包含二进制文件中的所有段的详细信息(代码,数据等)以及每个符号定义在哪个OBJ / LIB中。Windows调试器(如windbg.exe)可以使用映射文件来帮助定位程序崩溃的位置。映射文件是一种古老的技术:使用MSVC工具集的现代版本,PDB(程序数据库)文件可以完成所有映射文件的工作。

生成一个映射文件需要很长时间。如果你不需要映射文件但却在构建时看到了链接器选项/MAP,你应该移除它加快构建速度。最近我们已经完成了加速生成映射文件的工作,但是生成映射文件仍是一个缓慢的过程。

如果你是少数需要映射文件的人之一(例如,为了快速检查感兴趣的函数集或数据是否按照预期的或正确的二进制顺序排列),请放心,我们不会移除它。但是,以下几点将说明为什么您应该关闭/ MAP并使用PDB:

  • 关闭映射文件生成可以缩短构建时间。虽然我们最近在完全链接场景中提高了映射文件生成的吞吐量,但链接器还是无法增量更新先前链接生成的映射文件,因为这会影响增量链接吞吐量。跟PDB文件不同的是,在增量链接期间可以通过链接器精准的更新PDB文件。
  • 与PDB文件不同,二进制文件与其对应的映射文件之间没有紧密的绑定。跟踪哪个映射文件对应哪个版本的二进制文件是很困难的。
  • 与PDB文件不同,符号服务器不支持映射文件。
  • PDB文件中的信息是映射文件中的内容的超集。实际上,几乎所有的版本都会默认生成PDB文件。

最后,我们已经发布 DIA API ,人们可以使用它来编写自己的工具来从PDB文件中检索当前在映射文件中可用的所有信息。

最后

我们知道构建的吞吐量对于开发人员非常重要,我们正在继续改进我们的工具集的吞吐量性能。你可以阅读我们最近发布的博客 Visual Studio 2017 吞吐量的改进和建议 来了解更多我们为提高吞吐量所做的事情。记住检查你的构建选项看看你是否在生成不必要的映射文件!

如果您对我们有任何意见或建议,请告诉我们。您可以通过在下方评论,通过电子邮件(visualcpp@microsoft.com )与我们联系,您也可以通过产品中的 帮助>报告问题 或通过 开发者社区提供反馈。您还可以在Twitter(@VisualC )和Facebook(msftvisualcpp )上找到我们。