systemtap:能够访问本地变量但无法访问本地指针

时间:2016-01-21 07:15:37

标签: systemtap

我有一个愚蠢的问题, 我想借助系统tap了解源代码流,为此我试图使用kernel.statement探测函数访问局部变量,它显示除指针之外的所有其他变量。

probe module("Module_Path/proc_rw.ko").statement("my_write@Module Src Path/proc_rw.c+9")
{
    printf("local = %s\n", $$locals)
}


Module Code :
static ssize_t my_write(struct file *f, const char __user *buf, size_t len, loff_t *off)
{
        pid_t pid;
        int ret;
        struct task_struct *task_local;
        int *i;       
        ret=copy_from_user(c, buf, len);
        i=&ret;
        pid=simple_strtol(buf, NULL, 10);
        task_local=pid_task(find_vpid(pid), PIDTYPE_PID);
        return len;
}

当我执行上面的订书码时,它会返回

local = pid = 0xf98 ret = 0x0 task_local =? I =?

任何有助于理解为什么不打印task_local和i值的帮助都会有所帮助。

此致 佳日。

1 个答案:

答案 0 :(得分:1)

您在这里看到的是编译器优化的假象。不再使用的变量可能会释放其资源(重用寄存器或堆栈帧槽),因此即使它们在理论上属于范围,也可能没有任何值可读。

如果你在一个类似的程序上运行gdb并走到一条很远的线上,然后尝试打印这些变量,你会看到同样的事情。或者尝试:

stap -L 'module("Module_Path/proc_rw.ko").statement("my_write@*:*")'

查看声明转储&每个变量都可用。

另外,请参阅https://lkml.org/lkml/2015/4/23/605,了解内核补丁,旨在撤消最近(2014-10)不良的debuginfo质量下降。 (它没有合并。)但你可以通过自定义自己的Makefile来修复它自己的模块。