我想使用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?非常感谢!
答案 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会执行自动复制,但我还没看过它。我不了解其他实现。