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

时间:2012-07-20 16:07:22

标签: dtrace

我正在尝试读取在返回探测器中传递给函数的初始参数。与入口探测不同,返回探测中的参数变量(arg0arg1,...)不包含初始参数,我不知道如何能够检索这些参数值。

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

2 个答案:

答案 0 :(得分:2)

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

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;
}

答案 1 :(得分:1)

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