我正在尝试读取在我的返回探针中传递给函数的初始参数。与入口探针不同,返回探针中的参数变量( arg0
, arg1
,...) 不包含初始参数,我不确定如何检索这些值。
另外,由于并发问题,我想避免将值存储在全局变量中。
我正在尝试读取在我的返回探针中传递给函数的初始参数。与入口探针不同,返回探针中的参数变量( arg0
, arg1
,...) 不包含初始参数,我不确定如何检索这些值。
另外,由于并发问题,我想避免将值存储在全局变量中。
您可以将参数保存在线程本地存储中,例如
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;
}
正如 rmh 回答的那样 - 使用局部变量是这样做的方法。否则,dtrace 将不得不在输入时为您保存值 - 它对传入的参数或您的期望一无所知,并且必须进行垃圾收集。(从技术上讲,它确实知道会发生什么 - 最终 - 但与映射到一组简单虚拟 D 指令的局部变量方法相比,这会增加复杂的开销)。