【问题标题】:Is there any good way to access structure in user-land?有什么好的方法可以访问用户区的结构吗?
【发布时间】:2014-01-10 08:52:06
【问题描述】:

我想使用 Dtrace 来获取用户空间结构中成员的值,而不是内核。

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 脚本非常笨拙。如果结构包含许多成员,我需要计算每个成员的偏移量。如果结构中包含指针数组,情况就很糟糕了!

那么,在用户态进程的结构中,有没有简单而优雅的方式来访问成员?非常感谢!

【问题讨论】:

    标签: dtrace


    【解决方案1】:

    在 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()

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

    我认为 illumos 的 DTrace 执行自动复制,但我没有看过它。我不知道其他实现。

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多