【问题标题】:how to enter while loop using gdb?如何使用gdb进入while循环?
【发布时间】:2012-10-18 09:18:13
【问题描述】:

我有一个while 循环,如下所示。

while (*d++ = *sc++)

由于我希望了解部门中的指针,我想进入while 循环并了解while 循环如何处理指针。

我在gdb 中使用了step,但它并没有完全进入while 循环。有什么方法可以进入while 循环并了解每个 步骤中的操作。

【问题讨论】:

标签: c gdb


【解决方案1】:

* 绑定比后缀++ 更紧密。右侧的++ 将被最后应用,所以:

while (*d++ = *sc++)

等同于:

while (*d = *sc)
{
  d++;
  sc++;

修改最好在gdb中追踪。

更新:

不要像这样的 OP 编码!

虽然它看起来很酷,但证明你很聪明。普通人脑难以解析,容易出错?我们不想要,是吗?

最好选择上面建议的更清晰的替代方案,让编译器打乱代码。

【讨论】:

  • 我完全同意。名言完美地总结了这一点:"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." -Brian Kernighan
  • @Lundin,Keringham 在他的书“有经验的 C 程序员会更喜欢...while (*s++ = *t++);...虽然这乍一看可能看起来很神秘,但符号上的便利性是相当可观的,而且这个成语应该掌握,因为你会经常在C程序中看到它。” (有些转述,“C 编程语言”,第 5.5 节)?
  • @ugoren 确实,他自己对正确的编码风格一无所知,因为在撰写 K&R 书时,甚至还没有发明正确的编码风格。那本书充满了非常糟糕的编码风格示例。因此,您必须将他的声明阅读为“自 70 年代中期以来一直处于昏迷状态并且刚醒来的经验丰富的 C 程序员更愿意......”
  • “克里特岛的埃皮门尼德斯说所有的克里特岛人都是骗子,克里特岛人的所有其他言论肯定都是谎言。这是谎言吗?” (伯特兰·罗素:基于类型理论的数学逻辑 [cfh.ufsc.br/~dkrause/pg/cursos/selecaoartigos/…) ;-) @ugoren
  • 不管怎样,@Lundin 的 Kerringham 肯定比我的 Kerringham 更懂编程。
【解决方案2】:

选项 1: 按照 Olaf Dietsche 的建议查看 assembly code debugging

选项 2: 汇编后使用gcc -S test.c 停止编译器以查看程序的汇编代码。理解汇编代码可能有点困难。更多信息here

选项 3: 将您的程序重写为类似

while(1)
{
    if(*d++ != *sc++)
    {
        break;
    }
}

这样您就可以放置断点并查看值的变化。

【讨论】:

  • 我尝试了第三个选项,但仍然不相信。我想我需要深入研究组装
  • 我想说深入理解的最佳方法是选项 1。
【解决方案3】:

编写代码的另一种但相同的方法是:

*d = *sc;
while (*d > 0)
{
  d++;
  sc++;
  *d = *sc;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2012-08-26
    • 2021-03-26
    • 1970-01-01
    • 2013-04-01
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多