如何防止gdb在下一个命令后停止

时间:2013-01-10 15:30:44

标签: c debugging gdb

我正在尝试定义一个命令链,它应该在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'之后立即返回并打印。我之前使用下一个命令出现的问题现在出现在finish命令中:执行将在此命令后停止,gdb将等待用户输入,忽略以下printf和continue语句。对不起,这个问题有点令人困惑。我自己并不高兴,但是再次发布它不会是一个更好的解决方案(因为评论会丢失,而且会发生交叉发布)。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

    define myfinish
      finish
    end

    define hook-myfinish
      printf "some_string"
      continue
    end

    break some_function
    commands
      myfinish
    end

建议在break命令部分的开头使用silent语句来抑制 破坏时的额外输出:

    break some_function
    commands
      silent
      myfinish
    end