【问题标题】:when are debug symbols included何时包含调试符号
【发布时间】:2013-06-06 13:10:54
【问题描述】:

调试符号是在编译过程的哪个阶段实际生成的。

如果我用 -g 选项编译一个目标文件,那么无论是什么目标文件都必须内置(共享库、静态库、可执行文件),输出中总会有调试符号吗? 如果在链接过程中不指定-g,输出二进制文件是否有调试符号?

【问题讨论】:

  • 您是在询问特定的编译器吗?
  • 并非所有编译器都有 -g 选项。所问的问题不能笼统。
  • -g 我的意思是编译器标志包含调试符号!!!
  • 都是一样的,不同的编译器和不同的平台,存在不同的符号处理方式。这个问题没有单一的答案。
  • 您不仅需要查看编译选项:还需要查看链接器选项。您可以使用调试符号编译东西,但链接器可能会将它们剥离。例如,对于 HP,您需要在链接器选项中添加 +noobjdebug 以获取调试符号。

标签: c debugging compiler-construction


【解决方案1】:
  1. 每个可重定位目标文件在.symtab 部分都有一个符号表,其中包括有关在程序中定义和引用的函数和全局变量的信息。但是,与编译器内部的符号表不同,.symtab 符号表不包含局部变量的条目。
  2. -g 允许使用额外的调试信息,例如行号。正如 David 所指出的,默认行为取决于编译器和平台。
  3. 您可以参考this page了解更多详情。

【讨论】:

  • 感谢您的链接。这就是我一直在寻找的东西。
【解决方案2】:

通常,-g 是一个编译器选项,因为编译器知道哪些源代码行用于生成特定指令。

但是,某些链接器还要求您指定 -g,并且根据您的链接器,您可能需要指定其他开关,因为至少在 solaris 上,它不会将所有调试信息都放在可执行文件中,并且调试器从 .o 文件中找到它需要的内容。

这一切都归结为阅读您的链接器文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2012-10-20
    • 2020-11-06
    • 2012-07-16
    • 2018-12-08
    • 2022-11-10
    • 2020-11-21
    相关资源
    最近更新 更多