内核调试 SystemTap
相关技术:utrace, probe, ftrace, dtrace, pstrace
原文连接
重点是需要内核的匹配
1.首先先查看你的内核版本
uname -a
2.6.18-194.el5
如果你的内核版本比较老的话,你需要去查找你需要的kernel-devel 的版本.
如果你想用yum去安装,你可以用 yum install kernel-devel
注意:在最新的yum里面安装的总是最新的kernel-devel的版本,kernel-devel 需要匹配内核版本
比如: CentOS release 5.5 (Final)用的是内核版本 2.6.18-194.el5
先下载 和内核版本一样的对应的
然后安装
rpm-ivh kernel-devel-2.6.18-194.el5-i686.rpm
安装好kernel-devel会有内核的目录在
/usr/src/kernels/2.6.18-194.el5-i686/
2.安装systemtap
yum install systemtap (stap -V 1.3/0.137 请安装elfutils-devel 才能提示你需要安装哪个版本的debuginfo)
3. 安装debuginfo 去
寻找和你内核完全匹配
(例如本机uname -r 2.6.18-194.el5 只能选
kernel-debuginfo-2.6.18-194.el5.i686.rpm
kernel-debuginfo-common-2.6.18-194.el5.i686.rpm
)
kernel-debuginfo-common-xxxxx
kernel-debuginfo-xxxx
如果你找不到对应的内核版本的rpm,你可以去google 去寻找,可以使用redhat的debuginfo rpm 包
redhat内核参考下载
安装rpm -ivh kernel-debuginfo*.rpm
如何测试:
stap -ve 'probe begin { log("hello world") exit() }'
备注
官方推荐的安装命令
2 yum install systemtap kernel-devel yum-utils
debuginfo-install kernel 由于我的Centos yum repository上没有kernel-debuginfo包,于是得手工添加有这个包的repository。当然也可以把这个包及依赖包rpm文件下载到本地安装。
在/etc/yum.repos.d新建一个文件,我把他命令为debuginfo1
然后在debuginfo中加入
2
3
4
5
6 [debuginfo]
name=CentOS-$releasever - debuginfo
baseurl=http://debuginfo.centos.org/5/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 然后在执行官方推荐的安装命令的命令就可以了。整个过程要下载300多M文件,因此需要很长的时间。
官方wiki:
http://sourceware.org/systemtap/wiki/SystemTapOnCentOS
下午和周忱同学折腾复杂程序的内存泄漏问题,用了valgrind, gogle perftools等工具都不大好用,很容易把应用程序搞死,于是打算用systemtap来在libc.so层面了解内存的使用情况。主要思路就是看 malloc/realloc和free的调用次数的平衡。
首先准备下环境,系统是标准的RHEL 5u4:

$ uname -r
2.6.18-164.el5 $ stap -V
SystemTap translator/driver (version 1.3/0.137 non-git sources)
Copyright (C) 2005-2010 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: LIBRPM LIBSQLITE3 NSS BOOST_SHARED_PTR TR1_UNORDERED_MAP
$stap -L 'kernel.function("printk")'
kernel.function("printk@kernel/printk.c:533") $fmt:char const* $args:va_list $ stap -L 'process("/lib64/libc.so.6").function("malloc")'
Missing separate debuginfos, use: debuginfo-install glibc-2.5-42.x86_64

内核的符号是OK的,glibc没有安装符号。系统提示用 debuginfo-install glibc-2.5-42.x86_64 命令安装符号信息,但是RHEL 5不交钱不能用这个服务的,只能自己下载包安装。
$ wget -c ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/x86_64/Debuginfo/glibc-debuginfo-2.5-42.x86_64.rpm
$ sudo rpm -i glibc-debuginfo-2.5-42.x86_64.rpm
$ stap -L 'process("/lib64/libc.so.6").function("malloc")'
process("/lib64/libc-2.5.so").function("__libc_malloc@/usr/src/debug/glibc-2.5-20061008T1257/malloc/malloc.c:3560") $bytes:size_t
这次有了glibc的符号了,可以方便的跟踪libc.so中malloc的使用情况。
接着我们来简单的写个c程序调用malloc, 同时写个stap脚本来跟踪malloc的调用堆栈:

$ cat t.c
#include <stdlib.h> void fun() {
malloc(1000);
} int main(int argc, char *argv[]) {
fun();
return 0;
} $cat m.stp
probe process("/lib64/libc.so.6").function("malloc") {
if (target()== pid()) {
print_ubacktrace();
exit();
}
}
probe begin {
println("~");
} $ gcc -g t.c $ stap -L 'process("./a.out").function("*")'
process("/home/chuba/a.out").function("fun@/home/chuba/t.c:3")
process("/home/chuba/a.out").function("main@/home/chuba/t.c:7") $argc:int $argv:char**

现在程序准备好了,那么我们来执行下看内存泄漏在那里:
$sudo stap m.stp -c ./a.out
~
0x33d5e74b96 : malloc+0x16/0x230 [libc-2.5.so]
0x4004a6 [a.out+0x4a6/0x1000]
我们看到在a.out的0x4004a6的地方地方调用了malloc, 但是具体在程序里面是哪行呢? 用add2line就很容易找出来:

$ addr2line -e ./a.out 0x4004a6
/home/chuba/t.c:5
$ nl t.c
1 #include <stdlib.h> 2 void fun() {
3 malloc(1000);
4 } 5 int main(int argc, char *argv[]) {
6 fun();
7 return 0;
8 }

参考连接
Linux 下的一个全新的性能测量和调式诊断工具 Systemtap 系列
systemtapmanual
redhat systemtap introduce(pdf) 文库链接
ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/i386/Debuginfo
内核调试 SystemTap的更多相关文章
- 内核调试神器SystemTap — 简介与使用(一)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简介 SystemTap是我目前所知的最强大的内核调试工具,有些家伙甚至说 ...
- 内核调试神器SystemTap — 简单介绍与使用(一)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简单介绍 SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚 ...
- linux内核调试指南
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
- Linux内核调试的方式以及工具集锦【转】
转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- Linux内核调试的方式以及工具集锦
原文:https://blog.csdn.net/gatieme/article/details/68948080 CSDN GitHubLinux内核调试的方式以及工具集锦 LDD-LinuxDev ...
- linux内核调试技术之修改内核定时器来定位系统僵死问题
1.简介 在内核调试中,会经常出现内核僵死的问题,也就是发生死循环,内核不能产生调度.导致内核失去响应.这种情况下我们可以采用修改系统内核中的系统时钟的中断来定位发生僵死的进程和函数名称.因为内核系统 ...
随机推荐
- iBeacon技术
声明:部分资料来源自互联网 前言 iBeacon 最早推出是在今年的苹果 WWDC 大会上.作为 iOS 7 的一部分,它吸引人的一点是,iBeacon 是一种开发标准——绝大多数智能手机支持蓝牙 4 ...
- luogu P1966 火柴排队 (逆序对)
luogu P1966 火柴排队 题目链接:https://www.luogu.org/problemnew/show/P1966 显然贪心的想,排名一样的数相减是最优的. 证明也很简单. 此处就不证 ...
- ECshop二次开发 ECSHOP首页显示积分商城里的商品
以ECSHOP2.7.2官方默认模板为基础 1).首先打开 index.php 文件,在最末尾增加下面函数,注意千万不要写到 “?>” 的外面去,要加在“?>”的前面,加以下代码: /** ...
- PyCharm(一)——PyCharm设置SSH远程调试
一.环境 系统环境:windows10 64位 软件:PyCharm2017.3 本地Python环境:Python2.7 二.配置 2.1配置远程调试 第一步:运行PyCharm,然后点击设置如下图 ...
- 【php】Windows PHP及xdebug安装 安装
php version 7.0 redis 下载地址 https://pecl.php.net/package/redis 7.0版本的redis不再依赖php_igbinary.dll扩展,可以独立 ...
- Python的第3堂课
20181119笔记 一.内存管理相关 ①Cpython解释器的垃圾回收机制 什么是垃圾:当一个值没有被绑定任何变量名(即该值的引用计数为零时),该值就是垃圾. 垃圾回收是收回值占用的内存空间. 引用 ...
- vmware 装 puppy
说做就做了,但是开始怎么试都没装成功,后来在网上查了些资料,再结合自己的实践,终于成功了.下面我就把如何让Puppy Linux安装到VMware 硬盘上一步一步奉献给大家. 一.准备 1.1 安装好 ...
- intellij idea 17 log4j 中文乱码
先是在intellij idea里设置没有得到解决, 然后在tomcat的server.xml里设置没有得到解决, 再然后在log4j配置文件里配置没有得到解决. 以下是解决方案. C:\Progra ...
- (总结)CentOS Linux使用crontab运行定时任务详解
安装crontab:yum install crontabs 说明:/sbin/service crond start //启动服务/sbin/service crond stop //关闭服务/sb ...
- JSPatch部署JS代码控制OC代码
前言: 这里算是比较实用的一篇了吧,进行了网络安全部署 准备: bmob账号,JSPatch,公钥,私钥,MD5加密,AFNetWorking下载文件 #import <CommonCrypto ...