此查询通常用于验证堆栈的验证。下面是一个问题的例子,它可能有助于提供一些想法。
我正在处理 MIPS核心转储,其部分堆栈跟踪位于下方。
#2 0x7772027c in __assert13 (file=<optimized out>, line=<optimized out>, function=<optimized out>, failedexpr=<optimized out>) at /work.local/build/toolSpaces/tools01/E9-3-0/SW-NetBSD5/usr/src/lib/libc_r/../libc/gen/assert.c:61
#3 0x773baf3c in f10IpcSendWait (key=0x8f08, payload=0x76d9e318 "", len=0x274, tmout=0x3c, type=0xaf1, transaction=0xc0f) at f10IpcLib.c:2412
#4 0x77391d04 in cfgIpcSendWait (pkey=<optimized out>, cmdType=0x69, data=0x76d9e7a0, len=0x224, retStatus=<optimized out>) at f10CfgLib.c:751
#5 0x77391fc0 in f10CfgGetExact (pkey=0x1, usrData=0x784bb040) at f10CfgLib.c:554
#6 0x1002785c in f10GetBanner (pKey=0x8f08, bannerType=<optimized out>, sessionType=<optimized out>, sessionId=<optimized out>, bannerString=0x77b33000 <Address 0x77b33000 out of bounds>) at pamBannerHandler.c:123
#7 0x10040e40 in sshGetAuthBanner (banner=0x77b33000 <Address 0x77b33000 out of bounds>) at sshPamUtils.c:74
#8 0x10015b80 in userauth_banner () at auth2.c:176
#9 input_userauth_request (type=<optimized out>, seq=<optimized out>, ctxt=<optimized out>) at auth2.c:303
#10 0x76edbea0 in dispatch_run (mode=0x0, done=0x784bbb40, ctxt=0x784bb040) at dispatch.c:98
此处 userauth_banner ()使用参数 0x77b33000 调用 sshGetAuthBanner ()。但是,当我查看userauth_banner()的局部变量 banner 时,它显示了我绝对不同的值。
(gdb) p banner
$20 = 0x1 <Address 0x1 out of bounds>
我知道RISC参数可以在堆栈上传递 - 但我不能得到的是GDB如何将参数显示为0x77b33000。我猜这是在 sshGetAuthBanner ()之后调用的其他函数的参数或者是其他一些计算或操作的结果。
userauth_banner(void)
{
char *banner = NULL;
if ((banner = (char *)xcalloc(2, 25600)) == NULL)
goto done;
sshGetAuthBanner(banner);
if (!strlen(banner))
goto done;
所以,在我想要了解的所有内容中,我们应该寻找什么,以确定堆栈是否正确。而且,在上面讨论的情况下哪个值更可靠以及为什么。
任何指针都会有所帮助。