GDB: откуда он знает тип и размер переменной? - PullRequest
1 голос
/ 21 сентября 2011

Я пытаюсь это выяснить, поскольку я пытаюсь сделать то же самое (надеюсь) с помощью сценария собственного производства:

Пример кода C:

typedef struct _B
{
    A aa;
    double b;
    char c[LEN];
    int d;
    char *a_ptr[10];
 } B;

 B this_b;

ЕслиЯ компилирую это с gcc -g и gdb a.out впоследствии, gdb точно знает, что и где a_ptr:

(gdb) p &(this_b.a_ptr)
$1 = (char *(*)[10]) 0x804a084

как это происходит?И могу ли я сделать то же самое (зная его адрес и тип) через другие утилиты?

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

При сборке с флагом -g GCC (и большинство других компиляторов) сохраняет дополнительную «информацию об отладке» в вашем двоичном файле (a.out).

Вы можете проверить эту информацию с помощью инструментов, отличных отGDB.Например, readelf -w a.out (при условии, что вы используете Linux или другую платформу ELF).

Вы также можете сравнить размер a.out при сборке с -g и без него.Обычно двоичный файл отладки увеличивается в 5-10 раз.

1 голос
/ 21 сентября 2011

Эта информация известна во время компиляции. Gcc собирает его и сохраняет для последующего использования различными инструментами (в данном случае gdb).

...