使用GDB在堆栈上打印符号

使用GDB在堆栈上打印符号,gdb,stack,debug-symbols,stack-corruption,Gdb,Stack,Debug Symbols,Stack Corruption,我试图调试一个堆栈损坏的程序,该程序看起来太大(有多个线程),无法手动调试。因此,我想知道是否有一种方法可以打印出与损坏后堆栈上的地址相对应的符号,以便更好地了解它是如何到达那里的 我注意到“info symbol”命令(通常在给定地址打印符号)一次只接受一个地址。因此,我试图编写一个脚本来实现我想要的功能,但是当我试图将地址存储在方便变量中以便手动迭代堆栈时,info-symbol命令就不起作用了 我知道WinDBG上有dds命令,它完成了我要查找的功能,但我还没有在GDB中找到一个等效的命令

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

我注意到“info symbol”命令(通常在给定地址打印符号)一次只接受一个地址。因此,我试图编写一个脚本来实现我想要的功能,但是当我试图将地址存储在方便变量中以便手动迭代堆栈时,info-symbol命令就不起作用了


我知道WinDBG上有
dds
命令,它完成了我要查找的功能,但我还没有在GDB中找到一个等效的命令。有人知道一个等价物吗?

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


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

给定代码:

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 0x7fffffffe150: 0x7fffffffe168 0x5555555545fa <func2+23> 0x7fffffffe160: 0x2000000c2 0x7fffffffe180 0x7fffffffe170: 0x555555554613 <func1+23> 0x100000000 0x7fffffffe180: 0x7fffffffe1a0 0x55555555462e <main+25> 0x7fffffffe190: 0x7fffffffe288 0x100000000 0x7fffffffe1a0: 0x555555554630 <__libc_csu_init> 0x7ffff7a05b97 <__libc_start_main+231> 0x7fffffffe1b0: 0x1 0x7fffffffe288 0x7fffffffe1c0: 0x100008000 0x555555554615 (gdb)x/16ga$rsp 0x7FFFFFE150:0x7fffffffe168 0x555545FA<func2+23> 0x7FFFFFE160:0x200000C2 0x7fffffffe180 0x7FFFFFE170:0x554613<func1+23> 0x100000000 0x7FFFFFE180:0x7fffffffe1a0 0x5555462E<main+25> 0x7FFFFFE190:0x7FFFFFE288 0x100000000 0x7fffffffe1a0:0x55554630<_libc_csu_init> 0x7ffff7a05b97<_libc_start_main+231> 0x7FFFFFE1B0:0x1 0x7fffffffe288 0x7FFFFFE1C0:0x100008000x554615