使用systemtap调试linux内核

简介: 安装SystemTap(ubuntu10.10)简便的安装方式通过下面命令直接下载并安装在系统里:# sudo apt-get install systemtap也可以去http://sourceware.org/systemtap/getinvolved.html下载各种版本的systemtap。

安装SystemTap(ubuntu10.10)

简便的安装方式通过下面命令直接下载并安装在系统里:

# sudo apt-get install systemtap

也可以去http://sourceware.org/systemtap/getinvolved.html

下载各种版本的systemtap。

具体的安装说明可以参考官网上的指导:

http://sourceware.org/git/?p=systemtap.git;a=blob_plain;f=README;hb=HEAD

我参考的是一篇技术博客:

http://www.ningoo.net/html/2010/use_systemtap_on_ubuntu.html

 

Ubuntu Desktop默认没有安装kernel debug info的包,systemtap无法追踪内核信息。查看内核版本:

# uname –r

http://archive.ubuntu.com/ubuntu/pool/main/l/linux/?C=S;O=A下载对应的kernel debug info包

在网上下载不到linux-image-2.6.35-22-generic-dbgsym_2.6.35-22.35_i386.ddeb这个调试包,只用2.6.32和2.6.38版本的,所以我在vbox虚拟机上安装了ubuntu10.04(下载地址:http://www.ubuntu.com/download/ubuntu/download),其内核版本是:2.6.32-33-generic

http://ddebs.ubuntu.com/pool/main/l/linux/地址可以下载到对应的kernel debug info

注意下载调试包的时候注意后面的小号也要一致!用# uname –a来查看小号!



根据systemtap的语法规则,我尝试了一些命令的编写,可以编写个脚本对文件进行监测:

# sudo stap ‘probegeneric.fop.open { if(filename == "secrets") printf("%s isopening my file: %s\n", execname(), filename) }’

先运行上面监测命令,当打开secrets文件时,终端上将显示对文件的操作!


# sudo stap –ve ‘probebegin { printf("a \\ b "); for (c = 40; c < 48; c++) printf("%d ", c); printf("\12"); for (l = 0; l < 71; l++)printf("-"); printf("\12"); for (r = 30; r < 38; r++)for (t = 0; t < 2; t++) { printf("%d ", r); for (c = 40; c <48; c++) printf("\033[%d;%d%s %s \033[0;0m", r, c, !t ? "m": ";1m", !t ? "Normal" : "Bold ");printf("\12"); } exit(); }’

SystemTap不仅仅是一个简单的调试工具,强大的脚本语言能力让它同样能做一些有趣的事情,下面这个例子就可以对输出的字符进行美化:


在进行性能分析的时候,我们常常需要知道那些函数调用次数最多,才能有的放矢地展开分析。下面这个简单的例子可以打印出在过去的5秒钟里调用次数最多的那些系统调用。

# sudo stap -ve'global syscalls function print_top () { cnt=0 log("SYSCALL\t\t\t\tCOUNT") foreach ([name] in syscalls-) {printf("%-20s\t\t%5d\n",name, syscalls[name]) if (cnt++ == 10) break} printf("--------------------------------------\n") delete syscalls} probe syscall.* { syscalls[probefunc()]++ } probe timer.ms(5000) { print_top() }'


小结:

    在运行几个脚本后,我逐渐发现systemtap之所以受linux程序员的欢迎,是因为当你需要打印出某个函数的参数时,不再需要在内核源码中重新插入一行输出代码,然后重新编译内核才能看到想要输出的结果。有了systemtap可以通过编写一些脚本文件(.stp)自由的收集调试信息和性能数据,无需修改内核代码和漫长的内核代码编译了。

经过几个测试,开始了解了systemtap的基本工作原理,下面简单说下5个pass的作用:

Pass 1 - parse:这个阶段主要是检查输入脚本是否存在语法错误,例如大括号是否匹配,变量定义是否规范等

Pass 2 - elaborate:这个阶段主要是对输入脚本中定义的探测点或者用到的函数展开,不但需要综合SystemTap的预定义脚本库,还需要分析内核或者内核模块的调试信息

Pass 3 -translate: 在这个阶段,将展开后的脚本转换成C文件。前三个阶段的功能类似于编译器,将.stp文件编译成为完整的.c文件,因此又被合起来称为转换器(translator)

Pass 4 - build:在这个阶段,将C源文件编译成内核模块,在这过程中还会用到SystemTap的运行时库函数。

Pass 5 - run:这个阶段,将编译好的内核模块插入内核,开始进行数据收集和传输。










目录
相关文章
|
7天前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
44 15
|
12天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
61 6
|
27天前
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
47 14
|
1月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
1月前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
1月前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
1月前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
1月前
|
负载均衡 算法 Linux
深入探索Linux内核调度机制:公平与效率的平衡####
本文旨在剖析Linux操作系统内核中的进程调度机制,特别是其如何通过CFS(完全公平调度器)算法实现多任务环境下资源分配的公平性与系统响应速度之间的微妙平衡。不同于传统摘要的概览性质,本文摘要将直接聚焦于CFS的核心原理、设计目标及面临的挑战,为读者揭开Linux高效调度的秘密。 ####
37 3
|
2月前
|
负载均衡 算法 Linux
深入探索Linux内核调度器:公平与效率的平衡####
本文通过剖析Linux内核调度器的工作机制,揭示了其在多任务处理环境中如何实现时间片轮转、优先级调整及完全公平调度算法(CFS),以达到既公平又高效地分配CPU资源的目标。通过对比FIFO和RR等传统调度策略,本文展示了Linux调度器如何在复杂的计算场景下优化性能,为系统设计师和开发者提供了宝贵的设计思路。 ####
43 6
|
1月前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。