如何使用GDB获取函数的内存区域
问题描述:
据我所知,程序中的每个函数符号在地址空间都有相应的内存区域。 call
汇编指令推动ip
和其他一些信息在堆栈上并跳转到该范围的开始处。如何使用GDB获取函数的内存区域
我需要在使用GDB进行调试时获得该范围。我可以很容易地使用info symbol
获得与给定地址或行相对应的函数的名称。我需要相反的:符号 - >地址范围。实际上,我甚至可以使用TUI模式,将汇编代码滚动到函数末尾,并在最后一条指令附近查看“<symbol_name>
+ <offset>
”注释,但这绝对不是正确的方法(更糟的是,因为我使用GDB/MI)。
如何使用GDB将符号与其内存范围相匹配?
答
据我所知,对于程序中的每个函数符号,地址空间中都有相应的内存区域。
给定的“源”功能可以占据0(在情况下,函数不会被调用和所述接头垃圾收集它)或更多的地址链接的ELF图像中的范围内:
编译器可以自由地将函数分成多个部分,每个部分都有自己的地址范围,链接器没有义务将这些部分放在一起。 GCC会这样做,以便例如为了最大限度地减少TLB刷新,请在
foo
(foo.hot
部分)和频繁执行的部分(foo.cold
部分)中分别保留 频繁执行的部分。反转也是可能的:当
foo
被频繁地用一个固定的参数值调用时,GCC可以复制该函数(foo.clone.123
)并为该值优化该副本。
我如何使用GDB到内存范围内的符号匹配吗?
要找到范围的开始,只需print &foo
。
似乎没有办法在GDB中查找范围的末尾(除了已发现的disas
命令外)。在ELF平台上,您可以轻松地从例如readelf -Ws | grep foo