有没有什么好的方法来访问用户土地的结构?

时间:2014-01-10 08:52:06

标签: dtrace

我想使用Dtrace来获取user-land中结构中成员的值,而不是内核。

C代码喜欢这个:

typedef struct
{
     int a;
}st_A;

void fun1(st_A *p)
{
    ......
}

Dtrace脚本喜欢这个:

#!/usr/sbin/dtrace -qs

pid$1::fun1:entry
{
    printf("%d\n", *(int*)copyin(arg0, 4));
}

就个人而言,我认为这个Dtrace脚本非常笨拙。如果结构包含许多成员,我需要计算每个成员的偏移量。如果结构包含指针数组,情况可怕!

那么,是否有任何简单而优雅的方式来访问用户级进程中的结构中的membesr?非常感谢!

1 个答案:

答案 0 :(得分:4)

在Solaris上执行此操作的更常用方法是

typedef struct {
    int a;
} st_A;

pid$1::fun:entry
{
    self->kp = (st_A *)copyin(arg0, sizeof (st_A));
    printf("a = %d\n", self->kp->a);
}

但你是对的:如果你想跟随你的结构中的指针,那么你将不得不为每个解除引用重复copyin()

请记住,如果使用#include选项调用dtrace(1),则可以-C一个头文件。在任何情况下,使用-32-64来指示受害者进程的数据模型:默认情况下,dtrace(1)将使用正在运行的内核的数据模型解释您指定的任何类型。

我认为illumos的DTrace会执行自动复制,但我还没看过它。我不了解其他实现。