关于’gdb’下尾部优化代码的疑问

考虑C中的尾递归因子实现:

#include  unsigned long long factorial(unsigned long long fact_so_far, unsigned long long count, unsigned long long max_count){ if (max_count==0 || max_count==1 || count >= max_count) return fact_so_far; else { printf("%llu %p \n", count, &factorial); return factorial(fact_so_far * count, ++count, max_count); } } int main(int argc, char **argv) { unsigned long long n; scanf("%llu", &n); printf("\n Factorial %llu \n",factorial(1,0,n)); return 0; } 

我在’factorial’中放置一个断点,然后在’gdb’下运行上面的。 断点永远不会被击中。

假设它的尾调用已经优化(我已经使用gcc -O2编译它),它应该到达断点,至少一次,IIRC。

编辑:我得到了最终的结果,没有遇到任何断点。 例如,

 (gdb) b factorial Breakpoint 1 at 0x8048429: file factorial-tail.c, line 3. (gdb) run Starting program: /home/amit/quest/codes/factorial-tail 5 0 0x8048420 1 0x8048420 2 0x8048420 3 0x8048420 4 0x8048420 Factorial 120 Program exited normally. (gdb) 

我哪里错了?

可能是因子函数被内联到main中。 如果发生这种情况,将会有第二个factorial副本用于来自其他.c文件的调用; 这就是你的断点所在。 尝试传递-fno-inline。

对我来说很好。 您是成员在编译时使用-g标志添加调试信息? 你记得你必须输入一个数字来计算阶乘?