【问题标题】:How to set conditional breakpoint on return statement globally?如何在全局返回语句上设置条件断点?
【发布时间】:2014-09-22 05:53:14
【问题描述】:

我有一个充满功能的代码,例如:

bool f_i() 
{
    if (!f_0()) {
        return false;
    }
    if (!f_1()) {
        return false;
    } 
    // ...
    if (!f_n()) {
        return false;
    } 
    return true;
}
// etc...

在某些执行步骤中,一些被调用者可以返回false,而false 会传播到所有调用者。目前很难编写错误消息(代码正在迅速更改)。在调试期间,在每个 return false; 之前都有错误消息是过多的。

是否可以使用GDB 全局在return 语句上设置条件(例如,函数返回false)断点?

【问题讨论】:

  • 你能把它分成多行然后断线吗? b file.cpp:12
  • @Ben 不,我不能。有大量的一行,其中包含return false;
  • 我认为它比这复杂得多,因为整个事情都简单地转移到return f1() && f0();。无论如何,如果归结为带有bool 转换运算符的结构和预处理器上的一点扭矩,如果足够用力(并给你一个设置断点的地方:在运算符上),它可能会起作用。祝你好运。
  • @WhozCraig 不错的方法。这将是最后的手段。
  • AST matchers in clang++,但我想不出怎么用。顺便说一句,GDBrbreak(使用正则表达式)命令,但它只专门用于函数名称。

标签: c++ gdb breakpoints conditional-breakpoint


【解决方案1】:

在某些执行步骤中,某些被调用者可能返回 false

据我了解,您想在f_i() 中找到返回false 的第一个函数。您可以为此使用reverse debugging。 你可以:

  1. 结束当前帧执行

    (gdb) 鳍

  2. 后退一步,如果返回值为false

    (gdb) 逆步

  3. 如果你需要,你可以继续往回走,深入false传播调用

    (gdb) 反向鳍
    (gdb) 反步

【讨论】:

  • 函数不是一个。在不同的翻译单元中有很多类似的功能。
猜你喜欢
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 2012-02-20
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多