我正在调试一些C代码我想在某个函数返回时对消息进行dprintf,而不管它实际如何返回,即使它返回时没有命中文本返回语句(例如,当一个void函数到达其主体的末尾时)我知道我可以为一个13行长的函数写一些东西但如果我积极编辑这个函数,这就很糟糕了,因为我可能会改变它的长度。
这可能吗有人知道怎么做吗?
谢谢兄弟们

最佳答案

这不容易,但可以做到它需要技巧或一些Python编程。
诀窍是老一套您要做的是在函数的开始处创建一个断点,然后在返回位置设置一个临时断点,以执行您所需的操作例如:

break function
commands
  up-silently
  tbreak
  commands
    printf "hi!\n"
    cont
  end
  cont
end

这里要注意的一点是,没有参数的tbreak将停止在当前的PC上,up框架中的PC是返回位置。
这在很多情况下都能很好地工作——但不是全部特别是,如果您使用next来单步执行代码,并且您跳过了对function的调用(甚至是堆栈下面某个地方的调用),gdb将充当您键入cont的角色,并且将忘记为next停止(我还模糊地记得,在gdb的某些版本中,不能像这样嵌套commands因此,也可能会有这种情况。)
这个怪癖,FWIW,是next想要处理得更好的事情之一。
使用Python脚本,您可以做得更好——您还可以让它在dprintf中正常工作这样做的方法是子类化next,并在上面的代码中创建子类的实例。
你的子类可以做你喜欢的所有动作在您的例子中,您将实现gdb.FinishBreakpoint方法来打印您想要的消息,然后返回stop这将使finish断点不会导致用户可见的停止,从而使False正常工作。
next的另一个好处是您可以访问函数的返回值。

07-24 15:09
查看更多