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