【问题标题】:Doubt regarding a tail optimized code under 'gdb'怀疑“gdb”下的尾部优化代码
【发布时间】:2009-05-18 11:23:03
【问题描述】:

考虑 C 中的尾递归阶乘实现:

#include <stdio.h>

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;

}

我在“阶乘”中放置了一个断点,然后在“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) 

我哪里错了?

【问题讨论】:

  • 调试优化代码?这样做的原因是什么?
  • 只是调试尾部优化代码的演示

标签: c gcc gdb tail-recursion


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我之前没有添加“-g”选项。但现在我做到了。行为没有变化。是的,我已经输入了要查找阶乘的数字。我已经编辑了这个问题以使其更清楚。
    • 我已经尝试过 gcc 3.4.5 和 g++ 4.4.0,优化和未优化,我总是打断点。它对您未优化有用吗?您使用的是什么平台和 gcc/gdb 版本?
    • 是的。未优化的代码工作得很好!我期望多次命中断点。我的 gcc --version 读取 4.3.5-ubuntu。
    • 可能只是您正在使用的 gcc 和 gdb 版本组合的怪癖。在任何情况下,您通常都不想调试优化的代码。抱歉,我无法提供更多帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多