我是靠谱客的博主 甜甜大叔,最近开发中收集的这篇文章主要介绍systemtap 追踪vfs,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. systemtap 提供在脚本中嵌入C代码的功能, 下面给出一个demo, 在vfs_read函数返回的时候打印访问文件的inode,以及path信息。

%{
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/dcache.h>
#include <linux/fdtable.h>
%}

function task_file_handle_d_path:string (task:long, file:long) %{
        struct task_struct *p = (struct task_struct *)((long)STAP_ARG_task);
        struct file *f = (struct file *)((long)STAP_ARG_file);
        struct files_struct *files;
        int next_fd;
        char *page = NULL;
        char *path = NULL;

        rcu_read_lock();
        files = kread(&(p->files));
        next_fd = kread(&(files->next_fd));
        STAP_PRINTF("files %p, %dn", files, next_fd);
        if((page = (char *)__get_free_page(GFP_ATOMIC))) {
                path= d_path(&f->f_path,  page, PAGE_SIZE);
                if (path && !IS_ERR(path))
                        snprintf(STAP_RETVALUE, MAXSTRINGLEN, "%s", path);
        }
        CATCH_DEREF_FAULT();
        if (page)
                free_page((unsigned long)page);
        rcu_read_unlock();
%}

probe kernel.function("vfs_read").return {
        if (execname() != "stapio")
                task = pid2task(pid())
                printf("%s[%ld], %ld, %sn", execname(), pid(), $file->f_inode->i_ino, task_file_handle_d_path(task, $file))
}

probe timer.s(2) {
        exit()
}

在systemtap中嵌入C代码需要开启guru模式,关键的地方:

1. 在C里面访问参数需要加STAP_ARG_这个前缀,例如获取task, 用STAP_ARG_task

2. 在C里面访问内核的数据结构需要用kread,直接访问会导致kernel panic, 例如要获取task->files->next_fd, 需要这样:

files = kread(&(p->files));

next_fd = kread(&(files->next_fd));

另外还需要启动stap需要加--suppress-handler-errors, 否则会出现下面的错误:

stap -g -v   vfs.stp 
Pass 1: parsed user script and 116 library script(s) using 211688virt/39260res/3232shr/36532data kb, in 170usr/10sys/190real ms.
Pass 2: analyzed script: 3 probe(s), 10 function(s), 5 embed(s), 0 global(s) using 246272virt/75104res/4300shr/71116data kb, in 440usr/60sys/493real ms.
Pass 3: translated to C into "/tmp/stapTBcM0A/stap_9082c9054f8c3ce472afaf44567dace1_7235_src.c" using 246272virt/75448res/4644shr/71116data kb, in 0usr/0sys/4real ms.
Pass 4: compiled C into "stap_9082c9054f8c3ce472afaf44567dace1_7235.ko" in 990usr/240sys/1162real ms.
Pass 5: starting run.
ERROR: read fault [man error::fault] at 0x0000000000000828 (((&(p->files)))) near identifier 'task_file_handle_d_path' at vfs.stp:8:10

输出demo:

tmux[5471], 1206, /dev/ptmx
files 0xffff883fcf244600, 9
sshd[136585], 1206, /dev/ptmx
files 0xffff883fce4cc600, 16
tmux[5471], 1206, /dev/ptmx
files 0xffff883fcf244600, 9
sshd[136585], 1206, /dev/ptmx
files 0xffff883fce4cc600, 17
tmux[5471], 145785, /proc/5542/cmdline

参考链接:

https://sourceware.org/systemtap/langref/Components_SystemTap_script.html

https://zhengheng.me/2015/02/11/systemtap-analy/

最后

以上就是甜甜大叔为你收集整理的systemtap 追踪vfs的全部内容,希望文章能够帮你解决systemtap 追踪vfs所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部