gdb可以在/ dprintf上打开/指定位置为:从指定函数返回吗?

时间:2015-06-11 01:33:49

标签: c debugging gdb

我正在调试一些C代码。我希望在某个函数返回时dprintf消息,无论它实际返回的方式如何,即使它返回时没有按下文字return语句(例如,当void函数到达其主体的末尾时)。我明白我可以写,例如dprintf name_of_fn:13, "message %d\n", param或者身体长13行的函数。但是如果我正在积极地编辑这个函数,这很糟糕,因为我可能会改变它的长度。

这可能吗?有谁知道怎么做?

感谢同性恋者

2 个答案:

答案 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)