Gcc gdb:它是如何获得可执行文件的信息的?

Gcc gdb:它是如何获得可执行文件的信息的?,gcc,gdb,Gcc,Gdb,我们可以在func上设置断点,因此gdb知道某个函数的入口和出口地址。但它是如何获得这些信息的呢?它是否对可执行文件使用DWARF或readelf,如果是,如何使用? 谢谢GDB使用多个“信号”: 它读取符号表 它可以应用启发式跳过过去的函数prolog(通常您不想在函数prolog中停止,因为调用参数可能尚未设置,如果打印出来,看起来会很“有趣”) 如果 如果可用,它还会读取调试信息 (可以是矮人,刺,或 其他一些取决于 平台和编译器) 一般来说,GDB不会调用“external”read

我们可以在func上设置断点,因此gdb知道某个函数的入口和出口地址。但它是如何获得这些信息的呢?它是否对可执行文件使用DWARF或readelf,如果是,如何使用? 谢谢

GDB使用多个“信号”:

  • 它读取符号表
  • 它可以应用启发式跳过过去的函数prolog(通常您不想在函数prolog中停止,因为调用参数可能尚未设置,如果打印出来,看起来会很“有趣”)
  • 如果 如果可用,它还会读取调试信息 (可以是
    矮人
    ,或 其他一些取决于 平台和编译器)
一般来说,GDB不会调用“external”
readelf
可执行文件——它包含直接读取信息的所有智能

如果您想知道这是如何做到的,请阅读。

GDB使用多个“信号”:

  • 它读取符号表
  • 它可以应用启发式跳过过去的函数prolog(通常您不想在函数prolog中停止,因为调用参数可能尚未设置,如果打印出来,看起来会很“有趣”)
  • 如果 如果可用,它还会读取调试信息 (可以是
    矮人
    ,或 其他一些取决于 平台和编译器)
一般来说,GDB不会调用“external”
readelf
可执行文件——它包含直接读取信息的所有智能


如果您想确切地了解这是如何完成的,请阅读。

一个函数在DWARF中描述,带有一个DIE(调试信息条目),带有tag
DW\u tag\u子例程。模具具有属性
DW_AT_low_pc
DW_AT_high_pc
,这两个属性给出了函数的边界。

一个函数在DWARF中描述为带有标签
DW_tag_子例程的模具(调试信息条目)。模具具有属性
DW_AT_low_pc
DW_AT_high_pc
,它们给出了功能的界限。

取决于架构和工具链,但gdb可以读取DWARF、STAB和其他格式。取决于架构和工具链,但gdb可以读取DWARF、STAB和其他格式。