【问题标题】:Visual studio not showing symbol table?Visual Studio 不显示符号表?
【发布时间】:2018-11-16 01:06:40
【问题描述】:

我有这个源代码:

#include <iostream>
int snsn = 344;
int main()
{
    int anothername = 29;
    std::cout << &snsn << "\n";
    system("pause");
}

链接最终图像文件后,我在文件上运行dumpbin /SYMBOLS source.exe,但这是输出:

Dump of file source.exe

File Type: EXECUTABLE IMAGE

  Summary

        1000 .00cfg
        1000 .data
        1000 .idata
        3000 .rdata
        1000 .reloc
        1000 .rsrc
        7000 .text
       10000 .textbss

为什么不显示任何符号?

【问题讨论】:

  • /symbols 转储 COFF 符号,即出现在 .obj 和 .lib 文件中的那种。链接器使用它们。
  • @HansPassant 是的,我实际上设法在目标文件中使用 /SYMBOLS 选项显示了一些符号,但是,你能告诉我为什么它只显示像 snsn 这样的全局符号而不是像这样的本地符号作为anothername?如果是这样,你能告诉我如何展示当地的吗?
  • 链接器不涉及局部变量,它们存储在编译器选择的位置的堆栈帧中。像 snsn 这样的全局变量需要与其他源文件中的其他全局变量合并,因此它们的地址可能会改变。
  • @HansPassant 哦,但是为了让编译器进行类型检查等,每个函数都有“本地”符号表不是必须的吗?既然如此,为什么不能输出这个“本地”符号表的信息呢?
  • 调试器对那个细节感兴趣,它使用 PDB 文件。 blogs.msdn.microsoft.com/vcblog/2016/02/08/…

标签: c++ visual-studio


【解决方案1】:

Windows 上的可执行文件通常不会导出符号。

dumpbin /EXPORTS &lt;file&gt;

可用于 lib 文件或 dll 以查看导出的符号。

查看可执行文件使用的符号:

dumpbin /IMPORTS source.exe

即使可执行文件确实导出了符号,那么您的示例也可能只会导出 main。像anothername 这样的局部变量永远不会被导出。

/SYMBOLS 显示 COFF 符号表,它只存在于调试图像文件中:https://msdn.microsoft.com/en-us/library/b842y285.aspx

【讨论】:

  • 那么如何获取本地符号表呢?那不可能吗?就像目标文件只包含全局名称一样。谢谢! :))
  • “本地符号表”是什么意思?
  • 例如包含符号anothername的主函数的符号表
  • 没有这样的符号表。 anothername 可能存在的唯一位置是存储在 pdb 文件中的调试信息中。请参阅stackoverflow.com/questions/2040132/reading-a-pdb-file 查看 pdb 文件。
  • 谢谢。我去看看:)
猜你喜欢
  • 2022-12-18
  • 1970-01-01
  • 2011-02-12
  • 2019-05-15
  • 1970-01-01
  • 2020-10-13
  • 2015-09-12
  • 2014-10-01
  • 2020-04-11
相关资源
最近更新 更多