【问题标题】:What's the use of .map files the linker produces?链接器生成的 .map 文件有什么用?
【发布时间】:2010-10-19 20:08:21
【问题描述】:

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

【问题讨论】:

  • GNU Gas 使用-a 生成.map 文件。

标签: c++ visual-c++ linker


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    对于嵌入式系统,地图文件更有用。 (尽管您不会为此使用 Visual C++ ;)

    了解程序/数据内存即将耗尽以及特定变量所在位置等信息很重要。

    【讨论】:

    • UNIX 平台上有没有类似列表文件的东西?如果是,我如何生成它?
    【解决方案3】:

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

    基本上,它们将内存地址偏移映射到.exe(和/或加载的.dlls)中的函数和变量。如果您需要弄清楚客户为什么不高兴,这通常非常有用。当他们证明这不是你的错时更有用。

    调试“事后”崩溃最有用的方法是使用 WinDbg(Windows 平台)。打开它,然后打开故障转储。然后将源路径设置为指向代码(如果有的话),将符号路径设置为指向您的 .map 和 .pdb 以及指向 .exe 的图像路径,然后键入“!analysis -v强>”在命令行中。现在您有了带有代码行的完整堆栈跟踪 和所有内容。当然,您需要拥有与您正在调试的 exe 和 DLL 版本对应的正确版本的源代码。

    如果路径中有 MS 符号服务器,并且打开整页堆或 adplus 正在运行,那就更好了。尤其是使用 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/

    【讨论】:

    • 我们如何在 WinDbg 中使用 MAP 文件?
    【解决方案4】:

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

    例如:

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

    您可以使用地图文件作为调试工具。

    【讨论】:

    • 你的意思是像打开进程的反汇编并检查原始地址?
    • 这是可能的。就像我说的,你很少需要它们,但如果你需要它们,你会很高兴它们可用。
    【解决方案5】:

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

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

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

    我曾经从事过一个项目,该项目必须移植到没有语言环境支持的系统上。链接器报告“未定义对_localeconv_r 的引用”错误,通过搜索源来追踪这将是一件痛苦的事情。幸运的是,使用-Map=output.map 生成的 GCC 链接器映射文件通过一次搜索即可发现所有有问题的函数。

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 2020-01-28
      • 2016-03-29
      • 1970-01-01
      • 2021-01-21
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      相关资源
      最近更新 更多