我正在调试一些C代码。我希望在某个函数返回时dprintf消息,无论它实际返回的方式如何,即使它返回时没有按下文字return语句(例如,当void函数到达其主体的末尾时)。我明白我可以写,例如dprintf name_of_fn:13, "message %d\n", param
或者身体长13行的函数。但是如果我正在积极地编辑这个函数,这很糟糕,因为我可能会改变它的长度。
这可能吗?有谁知道怎么做?
感谢同性恋者
答案 0 :(得分:3)
这不容易,但可以做到。它需要一个技巧或一些Python编程。
诀窍是老派。你所做的是在函数开始时创建一个断点,然后在返回位置设置一个临时断点,它可以满足你的需要。例如:
break function
commands
up-silently
tbreak
commands
printf "hi!\n"
cont
end
cont
end
这里要注意的一点是,没有参数的tbreak
将停在当前的PC上 - 在up
帧中是返回位置。
这在很多情况下都会很好用 - 但不是全部。特别是,如果您使用next
来逐步执行代码,并且您跳过对function
的调用(即使是远离堆栈的某个地方),gdb将表现为您键入{{1 }},并将忘记停止cont
。 (另外,我有一个模糊的回忆,在某些版本的gdb中你不能像这样嵌套next
。所以也可能有这种情况。)
这个commands
怪癖,FWIW,是next
旨在更好地处理的事情之一。
使用Python脚本,您可以做得更好 - 您也可以使用dprintf
使其正常工作。这样做的方法是子类next
,并在上面的代码中创建子类的实例。
您的子类可以执行您喜欢的所有操作。在您的情况下,您将实现gdb.FinishBreakpoint
方法来打印所需的邮件,然后返回stop
。这将使终止断点不会导致用户可见的停止,从而使False
正常工作。
关于next
的另一个好处是你可以访问函数的返回值。
答案 1 :(得分:-1)
这是一个简单的例子,来自:https://sourceware.org/gdb/onlinedocs/gdb/Dynamic-Printf.html
引用的页面详细介绍了使用dprintf和gdb
的所有细节 (gdb) set dprintf-style call
(gdb) set dprintf-function fprintf
(gdb) set dprintf-channel mylog
(gdb) dprintf 25,"at line 25, glob=%d\n",glob
Dprintf 1 at 0x123456: file main.c, line 25.
(gdb) info break
1 dprintf keep y 0x00123456 in main at main.c:25
call (void) fprintf (mylog,"at line 25, glob=%d\n",glob)
continue
(gdb)