Вывод информационного кадра gdb: Неверное значение для списка аргументов в?

Просто любопытно, сможет ли кто-нибудь объяснить мне этот 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;
}

а вот результат gdb info frame при остановке на 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)

Почему locals и arglist находятся в одном месте? Насколько я понимаю, Locals at должен обозначать текущее значение ebp как адрес верхней границы для локальных переменных текущего кадра (что он и делает). Но почему список arglist указывает на одно и то же место? На основании вывода &argc значение Arglist at определенно не указывает на аргументы.

Кстати, я понимаю соглашение о вызовах x86 и структуру фреймов стека. Мне просто показалось странным, что все информационные фреймы, которые я смог найти, имели одинаковые значения Arglist at и Locals at, но только этот одинокий пост об этом несоответствии:

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

Во всяком случае, до некоторой степени интересно, есть ли известная причина для этого и / или как на самом деле публикуются сообщения об ошибке gdb. Спасибо!


person user22839    schedule 05.04.2014    source источник
comment
вау только один голос за. я столкнулся с той же проблемой: /   -  person PleaseHelp    schedule 25.01.2017


Ответы (1)


Этот результат - просто пережиток времен, предшествовавших DWARF. Его нужно просто удалить, по крайней мере, в некоторых случаях. Посмотрите на удивительно содержательную ошибку gdb: https://sourceware.org/bugzilla/show_bug.cgi?id=13260

person Tom Tromey    schedule 05.04.2014