我有一个愚蠢的问题,我想在系统点击的帮助下了解源代码流,为此我尝试使用 kernel.statement 探测函数访问局部变量,它显示除指针之外的所有其他变量。
probe module("Module_Path/proc_rw.ko").statement("my_write@Module Src Path/proc_rw.c+9")
{
printf("local = %sn", $$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;
}
当我执行上面的 stap 代码时,它会返回,
本地 = pid=0xf98 ret=0x0 task_local=? i=?
任何有助于理解为什么不打印 task_local 和 i 值都会有所帮助。
问候雅什。
您在这里看到的是编译器优化的工件。 不再使用的变量可能会释放其资源(重用寄存器或堆栈帧插槽),因此即使它们在理论上在范围内,也可能不再有读取的价值。
如果你在一个类似的程序上运行gdb,然后走到一个很远的下行,然后尝试打印这些变量,你会看到同样的事情。 或尝试:
stap -L 'module("Module_Path/proc_rw.ko").statement("my_write@*:*")'
以查看每个语句和变量的转储。
另请参阅 https://lkml.org/lkml/2015/4/23/605,了解旨在撤消最近(2014-10)调试信息质量的不良降低的内核补丁。 (它没有合并。 但是您可以通过自定义自己的 Makefile 来为您自己的模块修复它。