链接器生成的.map文件有什么用?

问题描述 投票:35回答:5

当使用/ MAP参数或“生成映射文件”项目设置时,VC ++链接器会产生.map文件的用途是什么?我什么时候需要它们?我如何从中受益?

c++ visual-c++ linker
5个回答
29
投票

关于如何使用地图文件查找崩溃的好文章。

http://www.codeproject.com/KB/debug/mapfile.aspx

手动完成这一切是非常无趣的。

我不知道有任何工具可以读取地图文件并帮助找到崩溃位置。如果有人知道请更新我们。


13
投票

对于嵌入式系统,地图文件更有用。 (虽然你不会使用Visual C ++;)

诸如了解程序/数据存储器的耗尽程度以及特定变量所在的位置等问题非常重要。


10
投票

在分析.hdmp和.mdmp崩溃转储时,WinDBG使用.map和.pdb文件来帮助调试崩溃。

基本上,它们将内存地址映射到.exe(或.dll)中的函数和变量。一般非常有用。

编辑:调试“事后”崩溃的最有用的方法是使用WinDbg(Windows平台)。打开它,打开崩溃转储。然后将源路径设置为指向代码(如果有),指向.map和.pdb的符号路径以及指向.exe的图像路径,并在命令行中键入“!analyze -v” 。现在,您可以获得包含代码行和所有内容的完整堆栈跟踪。 如果路径中有MS符号服务器,并且打开了整页堆或adplus正在运行,那就更好了。看看我最喜欢的两个WinDbg资源: 第一站:: http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx 强制加载符号:: http://www.osronline.com/ShowThread.cfm?link=182377 有用的网站:: http://www.dumpanalysis.org/blog/index.php/category/windbg-tips-and-tricks/page/7/


8
投票

您很少需要它们,但它们可以方便地调试一些问题,因为它们提供有关函数和数据位置的信息。

例如:

  • 所有细分(代码,数据和其他)的详细信息。
  • 将行号链接到代码

您可以使用映射文件来调试工具。


1
投票

当您需要跟踪编译单元和库之间的依赖关系时,链接器映射在大型项目中非常有用。通常,链接器将报告导致问题的符号,并且通常,对此符号名称的简单搜索不会返回任何结果(或者将返回tazxswpoi等符号的大量误报)。

如果没有链接器映射,您唯一的选择就是分析所有可用的源文件(在使用宏时预处理传递,通常就是这种情况)并希望您找到相关的位置。

链接器映射通常有一个名为“按文件/符号引用”的部分,它告诉您项目的另一个目标文件需要哪个目标文件,以及确切引用了哪个符号。

我曾经在一个项目上工作过,该项目必须移植到没有语言环境支持的系统上。链接器报告了“对read的未定义引用”错误,通过搜索源代码来追踪是很痛苦的。幸运的是,使用_localeconv_r生成的GCC链接器映射文件通过单次搜索显示了所有有问题的函数。

© www.soinside.com 2019 - 2024. All rights reserved.