【问题标题】:How to prevent gdb to stop after next command如何防止 gdb 在下一个命令后停止
【发布时间】:2012-12-25 01:06:08
【问题描述】:

我正在尝试定义一个命令链,应该在 gdb 中的断点之后调用:

    break some_function
    commands
       up
       next
       printf "some_string"
       continue
    end

在这种情况下(例如)我想在 some_function 处中断,在堆栈帧中向上并通过下一个命令跳到这个函数后面,然后打印“some_string”(或者可能是某个变量,它被函数),然后继续。但这不起作用,因为 gdb 将在下一个命令之后停止并等待用户输入内容,而忽略以下命令。

编辑: 好的,我上面给出的示例与我的描述不符。我真正想要的(感谢评论者 Nikolai,见下文)是这样的:

    break some_function
    commands
       finish
       printf "some_string"
       continue
    end

这将在“some_function”处中断,执行该函数,在“some_function”执行后立即返回并打印字符串“some_string”。我之前使用下一个命令遇到的问题现在出现在完成命令中:执行将在此命令之后停止,gdb 将等待用户输入,而忽略以下 printf 和 continue 语句。对不起,这个问题有点混乱。我自己对此并不满意,但再次发布它不会是一个更好的解决方案(因为 cmets 会丢失并且会交叉发布)。

【问题讨论】:

  • 从你所说的你想要finish,而不是next(此时你已经在函数中)。
  • “上栈”是什么意思?按一条指令返回?
  • ^^ 他的意思是从当前正在执行的函数中返回
  • 是的,谢谢,这就是我的意思。
  • @Nikolai: finish 可能是我想要的,而不是 up。我以为up 会完成当前功能,但我认为这是错误的。谢谢你给我这个提示,我将从上面调整我的代码,以更清楚地表达我想说的内容。

标签: c debugging gdb


【解决方案1】:

为什么不简单地在some_function+0x4 或类似的偏移处中断? 要知道正确的偏移量,请单击下一次,并记下偏移量...

break some_function+0x4
commands
   up
   printf "some_string"
   continue
end

【讨论】:

  • 嗯,我认为这不是我想要的(并且因为示例代码与我的描述不符,你试图猜测我想要什么 - 很好的猜测,但我不认为是吗)。我确实想完成当前功能(请参阅我的问题的编辑),尽管这实际上只是作为示例。真正的问题是,gdb 只是在诸如 next 和 finish 之类的语句之后停止。我也没有发现,如何让 gdb 打印当前偏移量。我试图阻止使用偏移量或行号的主要原因是,代码可能会改变,可能会使偏移量变得无用。
【解决方案2】:

好的,我想我自己找到了答案: gdb 似乎在内部设置了一个断点来完成和下一个命令。但是,可以定义一个钩子,以克服在此断点处的中断。我认为最好的方法是生成自己的完成版本(或下一个命令)以避免副作用,所以这是可以做的:

    define myfinish
      finish
    end

    define hook-myfinish
      printf "some_string"
      continue
    end

    break some_function
    commands
      myfinish
    end

建议在中断命令部分的开头使用silent 语句,以抑制 中断时的附加输出:

    break some_function
    commands
      silent
      myfinish
    end

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 2021-12-30
相关资源
最近更新 更多