映射文件是一个纯文本文件,其中包含有关某些名称和符号所在位置的信息 由链接器产生的二进制文件。 它也 包含二进制文件中所有部分(代码、数据等)的详细信息,以及 哪个对象/库 每个符号都是 定义于。Windows调试器(如windbg.exe)可以使用映射文件根据崩溃地址来帮助定位程序崩溃的位置。地图文件是一种古老的技术:使用MSVC工具集的现代版本 , PDB(程序数据库)文件完成了地图文件所做的一切。
生成地图文件需要很长时间。如果你看到 链接器开关/映射 但是你不需要地图文件,你应该移除这个开关来加速你的构建。我们最近做了一些工作来加速地图文件的生成,但是生成地图文件的过程会很慢。
如果您是少数需要映射文件的人之一(例如,快速检查感兴趣的函数集或数据是否按预期或正确的二进制顺序排列) , 请放心,我们不会移除它们。然而 , 以下是关于为什么您应该关闭/MAP并简单地使用pdb的几个要点:
- 关闭地图文件生成可以减少生成时间。虽然最近我们在全链接场景下提高了map文件生成的吞吐量,但是链接器无法增量更新先前链接生成的现有map文件,这会影响增量链接吞吐量。这对于PDB文件是不同的,它可以在增量链接期间由链接器通过手术进行更新。
- 与PDB文件不同,二进制文件与其对应的映射文件之间没有强绑定。很难跟踪哪个映射文件是哪个版本的二进制文件。
- 与PDB文件不同,没有像symbol server那样的对地图文件的支持。
- PDB文件中的信息是映射文件中信息的超集。实际上,默认情况下,几乎所有构建都将生成PDB文件。
最后,我们出版了 阿皮斯迪亚 那个 人们可以使用自己编写的工具从PDB文件中检索地图文件中当前可用的所有信息。
最后
我们知道构建吞吐量对开发人员很重要,我们正在继续改进我们的工具集的吞吐量性能。您可以阅读更多关于我们最近几年为提高吞吐量所做的工作 Visual Studio 2017吞吐量改进和建议 博客文章。记住检查你的构建,看看你是否正在生成不需要的地图文件!
如果您对我们有任何反馈或建议,请告知我们。我们可以通过以下评论和电子邮件联系到您( visualcpp@microsoft.com )你可以通过 帮助>报告产品中的问题 ,或通过 开发者社区 . 你也可以在Twitter上找到我们( @视觉 )还有Facebook( msftvisualcpp软件 ).