Gdb 为什么这个静态函数没有调试符号?

Gdb 为什么这个静态函数没有调试符号?,gdb,debug-symbols,Gdb,Debug Symbols,在源文件中有它的定义: (gdb) l main ... 4614 if (do_daemonize) 4615 save_pid(getpid(), pid_file); (gdb) l save_pid Function "save_pid" not defined. save\u pid和main在同一个源文件中,但只有main有调试符号,为什么 更新 另一个具有非常简单的静态函数的测试用例: static void save_pid(const

在源文件中有它的定义:

(gdb) l main
...

4614        if (do_daemonize)
4615            save_pid(getpid(), pid_file);
(gdb) l save_pid
  Function "save_pid" not defined.
save\u pid
main
在同一个源文件中,但只有
main
有调试符号,为什么

更新

另一个具有非常简单的静态函数的测试用例:

static void save_pid(const pid_t pid, const char *pid_file) {
    FILE *fp;
    ...
}
#包括
静态int测试()
{
返回0;
}
内部主(空)
{
//int i=6;
printf(“%f”,6.4);
返回0;
}
gcc-墙-g试验.c试验

但是符号
test
在那里

如果函数足够简单,并且它的地址从未被使用过,
是静态的
,那么它可能已经被内联,然后被丢弃(因为不可能从其他地方调用它)。

@geekosaur,感谢您的回复!但是我刚刚做了另一个测试,使用了一个非常简单的静态函数,但它并没有被丢弃。那么,您必须显示整个源文件。但是说实话,我想你应该问编译器它做了什么(
gcc-v…
)。啊,但是那一次你根本不调用它。我怀疑,根据优化级别,事实上,它根本找不到使用会使它认为它不知道发生了什么,并更好地输出它。但这取决于编译器版本和优化级别。您还可以包括
-v-Wall
,以了解它的想法。如果不清楚:编译器如何决定是否发出独立版本以及任何内联代码,这有点复杂。最后,您可能需要询问
gcc
开发人员,包括编译器版本、平台、完整源代码和完整编译器选项。
#include <stdio.h>

static int test()
{
        return 0;
}
int main(void)
{
        //int i = 6;
        printf("%f",6.4);
        return 0;
}

gcc -Wall -g test.c test