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

Posted

技术标签:

【中文标题】GDB:将参数转储到特定函数的所有调用【英文标题】:GDB: dump arguments to all calls of a specific function 【发布时间】:2015-02-26 20:54:10 【问题描述】:

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

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

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

提前感谢您的帮助。

最好的问候。

【问题讨论】:

【参考方案1】:

当然可以。有简单的方法,也有困难的方法。

简单的方法是,如果您有sqrt 的调试信息。大多数发行版都提供此功能;例如,对于 Fedora,您可以使用 debuginfo-install 来安装它。

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

break sqrt
commands
  silent
  info args
  cont
end

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

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

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

【讨论】:

请用 dprintf 添加示例

以上是关于GDB:将参数转储到特定函数的所有调用的主要内容,如果未能解决你的问题,请参考以下文章

GDB:当没有可用的名称符号时如何打印函数参数值

是否可以使用 GDB 查看未命名的框架/函数参数?

gdb 调试远程核心转储

在GDB中如何从文件中填充内存

GDB使用——pwn相关

GDB:如何在调试期间调用具有修改参数的函数