2013-02-14 67 views
0

在GDB中检查C二进制文件时,如何一次打印出堆栈中的多个值?我想类似以下的输出:打印注册表信息以获取堆栈位置GDB

0xbfc3ff70:  0xb7f4bff4  0xb7f89ce0  0x00000000  0xbfc3ff98 
0xbfc3ff80:  0xb7e4c943  0xb7f4c4e0  0x08048930  0xbfc3ffa4 
0xbfc3ff90:  0xbfc3ffa4  0xb7f4bff4  0xbfc3ffb8  0x08048625 
0xbfc3ffa0:  0x08048930  0xb7f81660  0x00000000  0xbfc45318 

回答

0

您可以使用$ SP引用堆栈寄存器的printf从堆栈中打印的值(如在C会),并从那里它只是一个铸件的事参数printf:

db $ printf "[%08X] 0x%08X 0x%08X 0x%08X 0x%08X\n", \ 
    $sp,      \ 
    *(unsigned int *) $sp,  \ 
    *(unsigned int *)($sp + 4), \ 
    *(unsigned int *)($sp + 8), \ 
    *(unsigned int *)($sp +12) 
[FFFFE080] 0x00000000 0x00000000 0xF7A3C76D 0x00000000 
db $ 

你当然应该把它包装在一个函数中。例如

define stackdump 
    printf... # show bytes 0-15 
    printf... # show bytes 15-31 
    printf... # show bytes 32-47 
end 

...并在〜/ .gdbinit坚持它,所以它会提供每次运行GDB的时间。