systemtap: есть доступ к локальным переменным, но нет доступа к локальным указателям.

У меня глупый вопрос, я хотел понять поток исходного кода с помощью системного крана, для этого я пытался получить доступ к локальной переменной с помощью функции проверки ядра.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;
}

Когда я выполняю вышеуказанный код stap, он возвращается,

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

Будет полезна любая помощь, чтобы понять, почему значения task_local и i не печатаются.

С уважением, Яш.


person Yash Jain    schedule 21.01.2016    source источник


Ответы (1)


То, что вы видите здесь, является артефактом оптимизации компилятора. У переменных, которые больше не используются, могут быть высвобождены ресурсы (повторно используются регистры или слоты кадров стека), поэтому, даже если они теоретически находятся в области действия, может больше не быть значения для чтения.

Вы увидите то же самое, если запустите gdb в аналогичной программе и перейдете к самой нижней строке, а затем попытаетесь напечатать эти переменные. Или попробуйте:

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

чтобы увидеть дамп операторов и переменных, доступных в каждом из них.

Также см. https://lkml.org/lkml/2015/4/23/605 для исправления ядра, направленного на отмену недавнего (2014-10) нежелательного снижения качества отладочной информации. (Он не был объединен.) Но вы можете исправить это для своего собственного модуля, настроив свой собственный Makefile.

person fche    schedule 21.01.2016