Каковы точки в переменных в «Неотладочные символы:» в GDB - PullRequest
0 голосов
/ 09 января 2019

Когда gdb исполняемый файл bash (скомпилирован с -g), и использовать info variables для проверки переменных.

Я получил что-то вроде этого. В символах есть точки. Кто-нибудь может помочь объяснить, что означает это уведомление?

Non-debugging symbols:
0x0000000100105380  read_alias_file.aliasfile
0x000000010010a320  set_pipestatus_from_exit.v
0x000000010010a458  set_maxchild.lmaxchild
0x000000010010a45c  waitchld.wcontinued
0x000000010010bec4  set_restricted_shell.save_restricted
0x000000010010bed0  internal_getopt.errstr
0x000000010010bedc  rangecmp.s1
0x000000010010bede  rangecmp.s2
0x000000010010bee0  rangecmp_wc.s1

Например, я вижу read_alias_file и aliasfile. Но я не знаю, что означает read_alias_file.aliasfile.

$ ack read_alias_file
lib/intl/localealias.c
145:static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
205:        added = read_alias_file (start, locale_alias_path - start);
220:read_alias_file (fname, fname_len)
$ ack aliasfile
lib/intl/localealias.c
227:  static const char aliasfile[] = "/locale.alias";
229:  full_fname = (char *) alloca (fname_len + sizeof aliasfile);
232:       aliasfile, sizeof aliasfile);
235:  memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);

1 Ответ

0 голосов
/ 09 января 2019

Я не знаю, что означает read_alias_file.aliasfile.

Это глобальная переменная aliasfile, которая видна только внутри функции read_alias_file.

Поскольку переменные с одинаковыми именами могут быть в нескольких файлах и функциях:

// foo.c
static int foo = 42;

// bar.c
int fn1() { static int foo = 43; ... }
int fn2() { static int foo = 44; ... }

и эти переменные должны храниться во всей программе, компилятор должен каким-то образом унифицировать их все, чтобы компоновщик не объединил их в одну переменную.

Добавление случайного числа, хэша имени файла / функции или имен файлов и функций - это общие стратегии.

Использование имени файла / функции (как, очевидно, делает ваш компилятор) упрощает определение, откуда foo. Вы не должны зависеть от этого, хотя - это полностью зависит от компилятора (если результирующие имена достаточно уникальны во время ссылки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...