如何使用 dtrace 跟踪函数?

Posted

技术标签:

【中文标题】如何使用 dtrace 跟踪函数?【英文标题】:How to trace a function using dtrace? 【发布时间】:2014-07-14 04:56:02 【问题描述】:

我在 dhcpagent 命令中进行了一些更改,但在测试时,它有点失败。现在我知道在 dhcpagent 退出之前最终调用了哪个函数。我想跟踪从 dhcpagent 到那个特定函数的控制,比如说 foo()。我正在寻找谁调用了 foo() 以及谁调用了该函数等等,就像一个家谱,从 dhcpagent 到 foo()。我该怎么做呢 ?我对 dtrace 有非常基本的了解,例如如何构建基本脚本,但仅此而已。您能否推荐一个脚本/资源,让我可以自己学习和编写脚本?

我做了什么尝试:

pid$target::functionname:entry  //and the target was dhcpagent from the command line

谢谢

【问题讨论】:

试试这个。 joyent.com/blog/bruning-questions-debugging 【参考方案1】:

我认为以下脚本可以帮助您:

#!/usr/sbin/dtrace -Fs
pid$target:::entry,  
pid$target:::return


在上面的脚本中,它可以打印出函数是如何被调用的。但是输出可能非常大! 如果你只关心dhcpagent 模块,我认为下面的脚本是一个更好的选择:

#!/usr/sbin/dtrace -Fs
pid$target:dhcpagent::entry,  
pid$target:dhcpagent::return


【讨论】:

以上是关于如何使用 dtrace 跟踪函数?的主要内容,如果未能解决你的问题,请参考以下文章

利用DTrace实时检测MySQl

从 DTrace 脚本调用 C 函数

使用 DTrace 在 Rust 上获取堆栈跟踪/分析数据

dtrace 仅在函数返回特定模块时执行操作

如何使用 dtrace 打印 libstdc++ 字符串内容

dtrace:如何从文件中获取符号链接目标