GDB:将参数转储到特定函数的所有调用

时间:2015-02-26 20:54:10

标签: c gdb profiling

我需要在程序中将作为参数传递的值分析到标准C库函数sqrt()。

简单的方法是插入代码以在实际调用sqrt()之前将这些值转储到文件中(例如,简单的fprintf())。但是,如果从库内部调用sqrt(),或者从多个位置调用它,则任务可能变得很难。

有没有办法在GDB或其他一些调试工具中自动执行此操作?

提前感谢您的帮助。

最诚挚的问候。

1 个答案:

答案 0 :(得分:0)

当然,可以做到。有一种简单的方法和艰难的方式。

简单的方法是如果你有sqrt的debuginfo。大多数发行版都可以提供;例如,对于Fedora,您可以使用debuginfo-install进行安装。

在这种情况下,找到有问题的函数,在其上设置断点,并让断点命令打印参数:

break sqrt
commands
  silent
  info args
  cont
end

如果您有足够新的gdb,并且知道参数的名称,则可以使用dprintf命令。这将为您提供更好的格式,并且不会与其他调试命令(如next

进行严重交互

如果你没有调试信息,那就很困难。在这种情况下,您需要了解平台ABI。然后你仍然可以设置断点,然后打印相应的寄存器或转储相应的内存,具体取决于参数的传递方式。

另一种方法是使用SystemTap。对于这种跟踪来说,这是一个非常好的工具。