gdb信息框输出:“Arglist at”的值是否错误?

时间:2014-04-05 03:03:37

标签: x86 gdb stack-trace

只是好奇,但有人能够向我解释这个info frame输出。 这是一个玩具计划:

#include <stdio.h>

int foo(int argc) {
    printf("Hello world! %d\n", argc);
}

int main(int argc, char *argv[]) {
    foo(argc);
    return 0;
}

这是在info frame打破时的gdb foo输出:

(gdb) info frame
Stack level 0, frame at 0x28abf0:
 eip = 0x401196 in foo (a.c:4); saved eip 0x4011c4
 called by frame at 0x28ac10
 source language c.
 Arglist at 0x28abe8, args: argc=1
 Locals at 0x28abe8, Previous frame's sp is 0x28abf0
 Saved registers:
  ebp at 0x28abe8, eip at 0x28abec
(gdb) p &argc
$1 = (int *) 0x28abf0
(gdb)

为什么本地人和arglist在同一个位置?据我所理解, Locals at应将当前的ebp值表示为上限地址 对于当前帧的本地(它所做的)。但为什么arglist 指向同一个位置?基于打印&argc,值为 Arglist at肯定似乎没有指出论点。

顺便说一句,我确实理解x86调用约定和结构 堆栈帧。对我来说,所有的在线看起来都很奇怪 我能找到的信息框架具有相同的Arglist atLocals at值, 但只有这一个孤独的帖子关于这种不一致:

http://forums.devshed.com/programming-42/gdb-info-frames-arglist-locals-address-782598.html

无论如何,在某种程度上想知道是否有一个已知的原因 为此,和/或如何实际发布gdb错误。谢谢!

1 个答案:

答案 0 :(得分:2)

此输出只是DWARF之前的遗留物。它应该被删除,至少在某些情况下。请参阅非常简洁的gdb错误:https://sourceware.org/bugzilla/show_bug.cgi?id=13260