gdb中“非调试符号:”中的变量中的点是什么

时间:2019-01-09 01:25:26

标签: gcc gdb clang

在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_filealiasfile。但是我不知道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 :(得分:1)

  

我不知道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来自何处。但是,您不应该依赖于此-它完全取决于编译器(只要结果名称在链接时足够唯一)。