我正在尝试调试具有损坏的堆栈并且看起来太大(它有多个线程)的程序来手动调试。所以我想知道是否有办法在腐败后打印出与堆栈上的地址相对应的符号,以便更好地了解它是如何到达那里的。
我注意到"信息符号"命令(通常在给定地址打印出符号)一次只接受一个地址。所以,我试着编写一个脚本来做我想要的,但是当我试图将地址存储在便利变量中以便我可以手动迭代堆栈时,info符号命令就不起作用了。
我知道在WinDBG上有dds
命令执行我正在寻找的内容,但是我无法在GDB中找到等价物。有谁知道一个等价物?
答案 0 :(得分:0)
这可能无法解答您的问题,但可以帮助您确定堆栈损坏的位置。您是否尝试使用-fstack-protectorxxx标志进行编译?
https://en.wikibooks.org/wiki/Linux_Applications_Debugging_Techniques/Stack_corruption
答案 1 :(得分:0)
a
标志的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