【问题标题】:How to skip a number of iterations of a loop in GDB?如何跳过 GDB 中循环的多次迭代?
【发布时间】:2015-02-07 22:08:46
【问题描述】:

假设我有一个将迭代 100 次的循环,我想跳过 50 次迭代,但我想从那里继续按 next 以查看每一行。

我不想在循环之后设置断点,因为这样我会跳过所有迭代,而不仅仅是我想要的次数。

有没有办法在 GDB 中做到这一点?怎么样?

附:我不想从头到尾一直按next。太费时间了……

【问题讨论】:

  • 使用中断条件。
  • 好的。但在我的情况下,给定的循环位于另一个文件中的辅助函数内。我在调用函数的行使用“step”访问循环。如何在另一个文件的一行中设置中断条件?
  • 现在我知道了:你只需要这样做:b filename:numberOfTheLine,例如:b helper.c:70。谢谢。

标签: c debugging loops for-loop gdb


【解决方案1】:

在循环中设置断点,然后调用c 50继续50次

Debugging with GDB

5.2 继续和步进

继续[忽略计数]
c [忽略计数]
fg [忽略计数]
继续 程序执行,在您的程序最后停止的地址;任何 在该地址设置的断点被绕过。可选参数 ignore-count 允许您指定要忽略的更多次数 该位置的断点;它的效果就像忽略(见 部分中断条件)。参数忽略计数是有意义的 仅当您的程序由于断点而停止时。在其他时间, 继续的参数被忽略。

【讨论】:

    【解决方案2】:

    你可以使用条件断点

    break <lineno> if i > 50
    

    i 是循环索引

    【讨论】:

      【解决方案3】:

      可以使用条件断点。

      语法:

      b FileName.extension:lineNumber if varname condition
      

      示例:

      b File.c:112 if i == 50
      

      【讨论】:

        【解决方案4】:

        例如,在 C# 中,您可以执行“继续”以跳过迭代。 mod 3 等于 0 的跳过数字示例,因此将跳过数字 3、9、12、15 ...。

        static void Main(string[] args)
            {
                for (int i = 1; i <= 50; i++)
                {
                    if (i%3 == 0)
                    {
                        continue;                    
                    }
                    Console.WriteLine("{0}", i);
                }
                Console.ReadLine();
            }
        

        【讨论】:

        • 感谢您抽出宝贵时间撰写本文,但我的问题是关于 GDB(GNU 调试器)。
        • 问题是关于使用 gdb,而不是如何编写一个将跳过 50 次迭代的循环
        猜你喜欢
        • 1970-01-01
        • 2019-05-06
        • 2014-10-30
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        相关资源
        最近更新 更多