DTrace - 如何在返回探针中正确检索初始参数

Posted

技术标签:

【中文标题】DTrace - 如何在返回探针中正确检索初始参数【英文标题】:DTrace - How do I correctly retrieve initial parameters in the return probe 【发布时间】:2012-07-20 16:07:21 【问题描述】:

我正在尝试读取在我的返回探针中传递给函数的初始参数。与入口探针不同,返回探针中的参数变量(arg0,arg1,...)不包含初始参数,我不确定如何检索这些值。

另外,由于并发问题,我想避免将值存储在全局变量中。

【问题讨论】:

【参考方案1】:

您可以将参数保存在线程本地存储中,例如

pid$target:foo:bar:entry

    self->arg0 = arg0;
    self->arg1 = arg1;
    /*
     * Avoid the race in which dtrace(1) attaches to the victim during
     * the window between the two probes.
     */
    self->trace = 1;


pid$target:foo:bar:return
/self->trace/

    printf("arg0 = 0x%x, arg1 = 0x%x\n", self->arg0, self->arg1);
    /* Deallocate the thread-local storage. */
    self->arg0 = 0;
    self->arg1 = 0;

【讨论】:

【参考方案2】:

正如 rmh 所回答的那样 - 使用局部变量是这样做的方法。否则,dtrace 将不得不在输入时为您保存值 - 它对传入的参数或您的期望一无所知,并且必须进行垃圾收集。 (从技术上讲,它确实知道会发生什么 - 最终 - 但与映射到一组简单虚拟 D 指令的局部变量方法相比,这会增加复杂的开销)。

【讨论】:

以上是关于DTrace - 如何在返回探针中正确检索初始参数的主要内容,如果未能解决你的问题,请参考以下文章

Dtrace 无效的探针说明符错误

如何在 Mac OS X Leopard 上的 dtrace 中使用热点探针?

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

如何在 SmartOS 上使用 HotSpot DTrace 探针?

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

Ruby 2.0 中的新 Tracepoint API 是不是使用 dtrace 使用的相同探针?