只是好奇,但有人能够向我解释这个信息框输出.
这是一个玩具程序:
#include <stdio.h>
int foo(int argc) {
printf("Hello world! %d\n", argc);
}
int main(int argc, char *argv[]) {
foo(argc);
return 0;
}
这是在foo处打破时的gdb信息框输出:
(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在同一个位置?据我所理解,
当地的at应该将当前的ebp值表示为上限地址
对于当前帧的本地(它所做的).但为什么arglist
指向同一个位置?基于print& argc,值为
绝对的Arglist似乎没有指向论点.
顺便说一句,我确实理解x86调用约定和结构
堆栈帧.对我来说,所有的在线看起来都很奇怪
我可以找到的信息框架具有相同的Arglist at和Locals at values,
但只有这一个孤独的帖子关于这种不一致:
http://forums.devshed.com/programming-42/gdb-info-frames-arglist-locals-address-782598.html
无论如何,在某种程度上想知道是否有一个已知的原因
为此,和/或如何实际发布gdb错误.谢谢!
最佳答案 此输出只是DWARF之前的遗留物.它应该被删除,至少在某些情况下.看到非常简洁的gdb bug:
https://sourceware.org/bugzilla/show_bug.cgi?id=13260