systemtap概述及实例

本文介绍了SystemTap这一强大的系统分析工具,它能够提供用户级和内核级代码的静态及动态跟踪功能。文章详细讲解了SystemTap的工作原理、安装步骤,并通过示例展示了如何使用SystemTap进行系统行为的监测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


systemtap对用户级和内核级代码提供了静态和动态跟踪的功能。Systemtap采用其他的内核框架做源:静态探针用tracepoints、动态探针用kprobes、用户级别的探针用uprobes。这些源也为perf、LTTng所用。

由于 systemtap 运行需要内核的调试信息支撑,默认发行版的内核在配置时这些调试开关没有打开,所以安装完systemtap也是无法去探测内核信息的。

Systemtap 工作原理是通过将脚本语句翻译成C语句,编译成内核模块。模块加载之后,将所有探测的事件以钩子的方式挂到内核上,当任何处理器上的某个事件发生时,相应钩子上句柄就会被执行。最后,当systemtap会话结束之后,钩子从内核上取下,移除模块。

工作原理如下图:

c1fd7adcdbe49bdef39239640b3d763cf487ac0c

安装

安装分为两部分:一部分为是systemtap工具本身,另一部分是内核调试信息。

在ubuntu中使用apt-get install systemtap命令进行安装。

 因为systemtap需要内核信息来防止指令,所以需要安装debug info,先通过命令uname -r查看内核版本,然后安装linux-image-[uname –r]-dbgsym

            Ubuntu参考:

https://wiki.ubuntu.com/DebuggingProgramCrash#Built-in_debug_symbol_packages_.28.2A-dbg.29

  其中4.4.0-63的下载链接如下:

http://launchpadlibrarian.net/304789714/linux-image-4.4.0-63-generic-dbgsym_4.4.0-63.84_amd64.ddeb

4.14.0下载地址:

https://launchpad.net/ubuntu/artful/amd64/linux-image-4.13.0-43-generic-dbgsym/4.13.0-43.48

ubuntu16的其他相关下载地址:

https://packages.ubuntu.com/zh-cn/xenial/amd64/linux-image-4.13.0-43-generic/download

或者直接运行stap-prep命令来进行安装。

也可以使用一个老外写的脚来下载,如下:

wget http://www.domaigne.com/download/tools/get-dbgsym

chmod +x get-dbgsym

sudo ./get-dbgsy

另外,实例脚本位于:/usr/share/systemtap/tapset中。

红帽手动配置debuginfo

编译完内核后,执行如下命令:

#ln -s /kernel/linux-4.15.15/vmlinux /boot/vmlinux-`uname -r`

#ln -s /lib/modules/`uname -r` /usr/lib/debug/lib/modules/`uname -r`

#cd /usr/lib/debug/lib/modules/`uname -r`

然后执行如下脚本:

for file in `find -name '*.ko' -print`

do

buildid=`eu-readelf -n $file| grep Build.ID: | awk '{print $3}'`

dir=`echo $buildid | cut -c1-2`

fn=`echo $buildid | cut -c3-`

mkdir -p /usr/lib/debug/.build-id/$dir

ln -s $file /usr/lib/debug/.build-id/$dir/$fn

ln -s $file /usr/lib/debug/.build-id/$dir/${fn}.debug

done

 

探针

探针的定义由句号分隔。示例如下:

begin:程序开始

end:程序开始

syscall.read: 系统调用read()的开始

syscall.read.return:系统调用read()的结束。

kernel.function(“sys_read”):内核函数sys_read()的开始

kernel.function(“sys_read”).return:内核函数sys_read的结束

socket.send:发送包

timer.ms(100):每100ms触发一次探针

timer.profile:按内核时钟频率对所有的CPU都触发的探针,用于采样/剖析。

process(“a.out”).statement(*@main.c:100): 跟踪目标进程,可执行文件a.out,main.c的100行。

 

tapset

一组相关的探针被称为tapset。

            syscall:系统调用

            ioblock:块设备接口和IO调度器

            scheduler:内核CPU调度器事件

            memory:进程和虚拟内存使用

            scsi:SCSI目标事件

            networking:网络设备事件

            tcp:TCP协议事件

            socket:套接字事件

此外systemtap还提供了许多action和内置变量,例如execname()获取进程名,pid()获取当前进程ID,print_backtrace()打印内核栈的回溯信息。

开销

systemtap 在编译阶段会消耗CPU资源。也可以在不同的系统上编译systemtap程序,然后将缓存结果传输给目标系统。

 

实战

执行如下代码:

# stap -ve 'probe begin {log("hello!") exit()}'

 

实例代码

创建open.stp代码如下:

#!/usr/bin/stap

probe begin

{

    log("begin to probe")

}

probe syscall.open

{

    printf ("%s(%d) open (%s)\n",execname(), pid(), argstr)

}

probe timer.ms(4000) # after 4 seconds

{

    exit ()

}

probe end

{

    log("end to probe")

}

使用

#stap open.stp 开始执行。

            这个脚本会在系统中调用open时候,将调用者的执行名字和进程号给打印出来,只要有人调用open就会打印,无所遁形。Systemtap提供了很多可以被printf函数调用的函数,除了execname(),pid()外,还有tid()等等。

            常用的有:tid(),uid(),cpu(),gettimeofday_s(),ctime(),pp(),thread_indent(),

            因为发行版本本身不包含debuginfo,所以在使用时候难免有些阻碍。

            相比oprofile,systemtap适合做跟踪,而oprofile适合做性能诊断。

参考

官方源码:https://sourceware.org/systemtap/documentation.html

《SystemTap_Begginers_Guide.pdf》

https://sourceware.org/systemtap/archpaper.pdf

官方实例:https://sourceware.org/systemtap/examples/

 

 

 

### 回答1: 《深入分析Linux内核源码 陈莉君pdf》是一本介绍Linux内核源码分析的教材。本书适合有一定编程基础和Linux操作系统了解的读者,帮助读者深入了解Linux内核的原理和实现。 这本书主要分为两个部分:前半部分是对Linux内核的概述和基础知识的介绍,后半部分则深入分析Linux内核的各个模块和功能。 在前半部分,作者介绍了Linux的发展历史、内核架构、进程管理、内存管理、文件系统等基础知识。通过这些基础知识的学习,读者可以对Linux内核的整体结构和运行原理有一个全面的了解。 后半部分则深入分析了Linux内核的各个模块和功能,如进程调度、内存管理、文件系统、网络协议栈等。作者通过阐述源码分析方法和示例代码,帮助读者理解和掌握Linux内核的具体实现。这些模块和功能的深入分析,可以帮助读者更好地理解Linux内核的工作原理,提升对系统的调试和优化能力。 总体而言,这本书对于想要深入了解Linux内核的读者来说非常有价值。通过分析内核源码,读者可以更好地理解Linux操作系统的底层原理和工作机制,从而对系统的运行和调试有深入的了解。但需要指出的是,由于Linux内核的复杂性,读者需要具备一定的编程和操作系统基础,以更好地理解书中的内容。这本书是一本较为深入的技术书籍,需要读者花一些时间和精力进行学习和实践。 ### 回答2: 《深入分析Linux内核源码 陈莉君pdf》是一本深入分析Linux内核源码的书籍,作者陈莉君是一位资深的Linux内核工程师。本书主要分为三个部分:内核原理、内核源码分析和内核调试技术。 首先,本书介绍了Linux内核的基本原理,包括进程管理、内存管理、文件系统、设备驱动等核心模块的实现原理。通过对这些原理的深入解析,读者可以更加全面地了解Linux内核的运作机制。 其次,本书详细解读了Linux内核的源码结构和各个模块的实现细节。作者通过逐行分析和注释,揭示了内核代码的设计思路和实现细节,让读者可以更加深入地理解内核源码的结构和逻辑。 最后,本书介绍了一些内核调试技术,包括使用gdb调试内核、使用内核跟踪工具分析内核性能等。这些技术可以帮助读者解决实际的内核问题,提高调试和优化内核的能力。 本书的特点是通俗易懂、深入浅出。即使读者没有过多的编程和操作系统基础,通过仔细阅读,也能够理解其中的内容。此外,本书还提供了大量的源码示例和实践案例,读者可以通过阅读和实践来加深对Linux内核的理解。 总而言之,《深入分析Linux内核源码 陈莉君pdf》是一本非常实用和权威的Linux内核书籍,对于需要深入了解Linux内核工作原理和如何分析和调试内核的开发人员和研究人员来说是一本宝贵的参考资料。 ### 回答3: 《深入分析Linux内核源码》是陈莉君编写的一本关于Linux内核源码分析的书籍。该书通过对Linux内核源码的解读和分析,帮助读者深入了解Linux内核的工作原理和设计思想。 首先,该书介绍了Linux内核的架构和基本组成,包括进程管理、内存管理、文件系统、设备驱动、网络和进程间通信等核心部分。通过对这些组件的详细解析,读者可以逐步建立起对Linux内核整体架构的认识。 其次,该书通过具体的代码实例,详细解释了Linux内核的关键数据结构和算法。例如,书中详细介绍了进程调度算法和内存管理机制的实现原理,读者可以通过代码级别的分析深入理解其工作原理和性能优化方法。 此外,该书还介绍了Linux内核的调试和性能分析工具,如GDB、SystemTap等。这些工具可以帮助读者在分析Linux内核源码时进行实时调试和性能优化,提高代码的可读性和性能。 总的来说,陈莉君的《深入分析Linux内核源码》是一本深入浅出、通俗易懂的Linux内核源码解析书籍。通过阅读该书,读者可以系统地学习和理解Linux内核的设计思想和实现方法,对Linux内核的开发和调试有更深入的认识和理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值