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

标签 c gdb profiling

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

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

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

在此先感谢您的帮助。

此致。

最佳答案

当然,这是可以做到的。有简单的方法和困难的方法。

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

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

break sqrt
commands
  silent
  info args
  cont
end

如果你有一个足够新的 gdb,并且你知道参数的名称,你可以使用 dprintf命令代替。这将为您提供更好的格式,并且不会与其他调试命令(如 next)发生不良交互。 .

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

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

关于c - GDB:将参数转储到特定函数的所有调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28752545/

相关文章:

c - 在其挂钟运行时间的一部分上测量守护进程 CPU 利用率

entity-framework - 使用mvc-mini-profiler的EF剖析性能慢

使用 Clang 编译并使用 GETTEXT

c - 在 GTK+ 3 C 中创建菜单时不显示菜单

c++ - "reserve"缓存部分是否有任何解决方法?

c - 将 double 转换为 float 后值不正确

使用 GCC 编译依赖 Open SSL 的 C 程序

c++ - 如何清除gdb命令屏幕?

gcc - objcopy 和 dsymutil 有什么区别?

linux - 如何获取 perf stat 列出所有可能的事件