【问题标题】:gdb info frame output: Wrong value for "Arglist at"?gdb 信息帧输出:“Arglist at”的值错误?
【发布时间】:2014-04-05 03:03:36
【问题描述】:

只是好奇,但有人可以向我解释这个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;
}

这是在foo 中断时的 gdb info frame 输出:

(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)

为什么 locals 和 arglist 在同一个位置?据我所理解, Locals at应该将当前ebp值表示为上界地址 对于当前帧的本地人(它确实如此)。但是为什么 arglist 指向同一个位置?基于打印&amp;argc,值为 Arglist at 似乎绝对没有指向论点。

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

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

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

【问题讨论】:

  • 哇,只有一个赞。我遇到了同样的问题:/

标签: x86 gdb stack-trace


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2011-07-05
    • 2019-07-31
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多