我正在调试一些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
的另一个好处是您可以访问函数的返回值。