使用 GDB 在堆栈上打印符号

Posted

技术标签:

【中文标题】使用 GDB 在堆栈上打印符号【英文标题】:Printing Symbols on the stack using GDB 【发布时间】:2017-05-23 18:07:16 【问题描述】:

我试图调试一个堆栈损坏并且看起来太大(它有多个线程)而无法手动调试的程序。所以我想知道是否有一种方法可以在损坏后打印出与堆栈上的地址相对应的符号,以尝试更好地了解它是如何到达那里的。

我注意到“信息符号”命令(通常在给定地址打印出符号)一次只接受一个地址。因此,我尝试编写一个脚本来执行我想要的操作,但是当我尝试将地址存储在便利变量中以便我可以手动遍历堆栈时,info symbol 命令不起作用。

我知道在 WinDBG 上有 dds 命令可以满足我的要求,但我无法在 GDB 中找到等效的命令。有谁知道等价的吗?

【问题讨论】:

【参考方案1】:

x 带有 a 标志的命令会将内存解码为地址并尝试查找符号

给定代码:

int func3(int a)

   return a+a;

int func2(int b)

   return func3(b+b);

int func1(int c)

  return func2(c+c);

int main(int argc, char** argv)

  return func1(argc);

func3 输出处的断点将是:

(gdb) x /16ga $rsp 0x7ffffffffe150: 0x7ffffffffe168 0x5555555545fa &ltfunc2+23&gt 0x7ffffffffe160:0x2000000c2 0x7ffffffffe180 0x7ffffffffe170: 0x555555554613 &ltfunc1+23&gt 0x100000000 0x7ffffffffe180: 0x7ffffffffe1a0 0x55555555462e &ltmain+25&gt 0x7ffffffffe190:0x7ffffffffe288 0x100000000 0x7ffffffffe1a0: 0x555555554630 &lt__libc_csu_init&gt 0x7ffff7a05b97 &lt__libc_start_main+231&gt 0x7ffffffffe1b0: 0x1 0x7ffffffffe288 0x7ffffffffe1c0: 0x100008000 0x555555554615

【讨论】:

【参考方案2】:

这可能无法回答您的问题,但可以帮助您确定堆栈损坏的位置。您是否尝试过使用 -fstack-protectorxxx 标志进行编译?

https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Stack_corruption

【讨论】:

以上是关于使用 GDB 在堆栈上打印符号的主要内容,如果未能解决你的问题,请参考以下文章

使 GDB 在调用函数时打印控制流

GDB:当没有可用的名称符号时如何打印函数参数值

gdb 在相对于基地址的地址处打印符号

获取 GDB 便利变量中保存的值的符号信息

Backtrace 中缺少 gdb 符号?

Linux里常见的gdb命令