systemtap notes -- 10 June 2014

1 Systemtap

systemtap是红帽开发的一款分析工具,如果你需要使用的话,最好在redhat的系统上,在 Ubuntu上兼容性不好,坑非常多,Ubuntu缺省提供的Kernel无法正常运行Systemtap,只能 跑跑HelloWorld,带的那些脚本都无法跑通,没法用。只能自己重新编译kernel,修改一些 CFLAGS参数。

我电脑使用的是ubuntu 12.04,kernel用的是trusy版本的3.13,Systemtap缺省版本是1.6 ,没法用。

1.1 使用前提

systemtap依赖dbgsym包,你必须安装kernel的dbgsym包,这个包在ubuntu的ddeb源提供1, 系统缺省不包括,需要自己添加:

tacy@tacy:~$echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list tacy@tacy:~$sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01 tacy@tacy:~$apt-get update

然后你就能看到很多dbgsym包,先安装对应kernel的

tacy@tacy:~$ uname -a
Linux tacy 3.13.0-27-generic #50~precise1-Ubuntu SMP Fri May 16 20:47:56 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
tacy@tacy:~$ apt-cache policy linux-image-3.13.0-27-generic
linux-image-3.13.0-27-generic:
已安装: 3.13.0-27.50~precise1
候选软件包:3.13.0-27.50~precise1
版本列表:
*** 3.13.0-27.50~precise1 0
500 http://mirrors.ustc.edu.cn/ubuntu/ precise-updates/main amd64 Packages
500 http://mirrors.ustc.edu.cn/ubuntu/ precise-security/main amd64 Packages
100 /var/lib/dpkg/status
tacy@tacy:~$ sudo apt-get install linux-image-3.13.0-27-generic-dbgsym=3.13.0-27.50~precise1

当然上面的前提是ubuntu提供的kernel没问题的前提下,如果你想在ubuntu下跑systemtap 可没那么轻松,必须自己编译kernel和dbgsym!

1.2 编译

 

1.2.1 kernel编译

导致ubuntu提供的kernel不能运行的systemtap的根本问题还是gcc,gcc的一些bug导致 产生了错误的debuginfo,无法正确定位变量2,产生如下错误信息:

semantic error: not accessible at this address [man error::dwarf] (0xffffffff811b42b0, dieoffset: 0x177422e): identifier '$file' at /usr/share/systemtap/tapset/linux/vfs.stp:855:9

当然systemtap对此问题进行了修正,但是它需要有gcc编译时使用的编译参数才行。gcc提 供了一个参数来记录编译时参数,但是ubuntu编译kernel的时候并没有带上这个参数,导 致systemtap无法正确定位参数的位置,另外gcc的这个参数只有在4.7以上版本才有,而 12.04缺省带的gcc版本是4.6!

所以基于上面这些问题,我们需要做两件事情,首先是升级gcc版本到4.7,接下来是编译 kernel,同时加上gcc参数来记录编译项。

升级gcc我就不详细介绍了,直接参考VK的文章3

编译kernel最关键的是修改gcc编译参数,这个问题搞了好几天,没办法,对kernel还是不 熟。

首先是你需要知道ubuntu下编译kernel的基本流程4。参考引用,我们先获取代码:

apt-get source linux-image-`uname -r`

接下来你需要进入源码目录,修改最上层目录下的Makefile,我的目录如下:

/home/tacy/Downloads/linux-lts-trusty-3.13.0/Makefile

修改内容如下:

HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -grecord-gcc-switches -O2 -fno-omit-frame-pointer
HOSTCXXFLAGS = -O2 -fno-omit-frame-pointer -grecord-gcc-switches
。。。
KBUILD_CFLAGS += -O2 -grecord-gcc-switches

主要是添加‘-grecord-gcc-switches‘和’-fno-omit-frame-pointer‘参数。

接下来就是编译了,如果你需要修改编译模块,直接用下面命令:

fakeroot debian/rules editconfigs
fakeroot debian/rules updateconfigs

注意下面项需要打开5

# for perf_events:
CONFIG_PERF_EVENTS=y
# for stack traces:
CONFIG_FRAME_POINTER=y
# kernel symbols:
CONFIG_KALLSYMS=y
# tracepoints:
CONFIG_TRACEPOINTS=y
# kernel function trace:
CONFIG_FTRACE=y
# kernel-level dynamic tracing:
CONFIG_KPROBES=y
CONFIG_KPROBE_EVENTS=y
# user-level dynamic tracing:
CONFIG_UPROBES=y
CONFIG_UPROBE_EVENTS=y
# full kernel debug info:
CONFIG_DEBUG_INFO=y
# kernel lock tracing:
CONFIG_LOCKDEP=y
# kernel lock tracing:
CONFIG_LOCK_STAT=y
# kernel dynamic tracepoint variables:
CONFIG_DEBUG_INFO=y

编译:

fakeroot debian/rules binary-generic skipdbg=false

然后安装编译包就行了,需要注意的时候编译过程会会占用16G左右的空间,并且编译过程 非常漫长,在我机器上跑了将近一个半小时,考验耐性~

1.2.2 systemtap

没啥特殊的,注意elfutils版本就行,缺省的0.152好像没问题。我编译了systemtap 2.5版 本,可以用,直接下载的源码包编译就行。

1.3 使用

看看使用效果:

tacy@tacy:/usr/local/share/doc/systemtap/examples/io$ sudo stap disktop.stp

Fri Jul  4 15:14:07 2014 , Average:  50Kb/sec, Read:     219Kb, Write:     32Kb

     UID      PID     PPID                       CMD   DEVICE    T        BYTES
1000 2496 1861 oracle sda5 R 131072
1000 2832 1 unity-panel-ser sda5 R 76217
1000 2496 1861 oracle sda5 W 32768
1000 2834 1 hud-service dm-1 R 16192
1000 2689 1 dropbox sda5 R 894 Fri Jul 4 15:14:12 2014 , Average: 42Kb/sec, Read: 192Kb, Write: 18Kb UID PID PPID CMD DEVICE T BYTES
1000 2496 1861 oracle sda5 R 131072
1000 8893 1861 oracle sda5 R 65944
1000 2496 1861 oracle sda5 W 16384
1000 5157 1 Chrome_CacheThr dm-1 W 2033
1000 2953 1 gnome-terminal sda5 W 1025
1000 5157 1 Chrome_CacheThr dm-1 R 36

好了,ubuntu上也能systemtap啦~

1.4 systemtap & byteman

另外需要注意的是systemtap可以配合byteman使用,但是~,基本上别抱啥希望,我尝试 了一下,问题一堆,能正常编译,无法使用,当然你也可以试试,一些需要注意的点:

仔细看systemtap源代码中java目录下的readme,这里有好几个坑:

首先是编译的时候要指定–with-java选项,否则不支持。

另一个是BYTEMAN_HOME,你从jboss网站上下载下来的byteman解压之后,jar包在lib目录下, 但是stapbm脚本直接忽略了lib目录,也就是说你找不到jar包,没有任何提示,无法成功。

其次是libHelperSDT_amd64.so和HelperSDT.jar两个文件,主要必须是做链接,不能拷贝 ,否则也是白搭,你可以看一下生成出来的C文件(在~/.systemtap/cache目录下),里面 有如下内容:

process(\"/usr/local/libexec/systemtap/libHelperSDT_amd64.so\").

人家明确写的是systemtap下的so文件,如果你拷贝到jdk目录下,直接无视,泪啊~~~, 为啥在README里面要写copy/link呢?

最后一个,必须是同一个用户的进程才行,也就是说如果你用root去分析其他用户的java进 程,不好意思,同样无视~~~

解决上面问题之后,简单的例子能跑了6,但是我尝试了一下对weblogic做profile, 不行,一直抛如下错误,放弃~

org.jboss.byteman.rule.exception.ExecuteException: stap_672db8a0071794f3697f800e2d70a51_22140probe_2237  : caught java.lang.ClassCircularityError: sun/reflect/MethodAccessorImpl
at org.jboss.byteman.rule.Rule.execute(Rule.java:716)
at org.jboss.byteman.rule.Rule.execute(Rule.java:653)
at java.lang.ClassLoader.loadClass(ClassLoader.java)
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
at sun.reflect.MethodAccessorGenerator.generateMethod(MethodAccessorGenerator.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:28)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.byteman.rule.expression.MethodExpression.interpret(MethodExpression.java:342)
at org.jboss.byteman.rule.Action.interpret(Action.java:144)
at org.systemtap.byteman.helper.HelperSDT_HelperAdapter_Interpreted_1.fire(tacy-22167.btm)
at org.systemtap.byteman.helper.HelperSDT_HelperAdapter_Interpreted_1.execute0(tacy-22167.btm)
at org.systemtap.byteman.helper.HelperSDT_HelperAdapter_Interpreted_1.execute(tacy-22167.btm)
at org.jboss.byteman.rule.Rule.execute(Rule.java:684)
at org.jboss.byteman.rule.Rule.execute(Rule.java:653)
at java.lang.ClassLoader.loadClass(ClassLoader.java)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:152)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:201)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1589)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1494)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1748)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155)
at com.sun.jmx.remote.internal.PRef.invoke(Unknown Source)
at javax.management.remote.rmi.RMIConnectionImpl_Stub.getAttribute(Unknown Source)
at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.getAttribute(RMIConnector.java:878)

systemtap notes的更多相关文章

  1. SystemTap Beginners Guide

    SystemTap 3.0 SystemTap Beginners Guide Introduction to SystemTap Edition 3.0   Red Hat, Inc. Don Do ...

  2. ASP.NET Core 1.1.0 Release Notes

    ASP.NET Core 1.1.0 Release Notes We are pleased to announce the release of ASP.NET Core 1.1.0! Antif ...

  3. [systemtap手记]debian体系安装过程

    Debian体系,本人测试用机 Ubuntu 11.10 uname -r 查看原本的内核版本为 3.0.0-12-generic 第一步: 安装systemtap包 $ sudo apt-get i ...

  4. Android Weekly Notes Issue #237

    Android Weekly Issue #237 December 25th, 2016 Android Weekly Issue #237 这是本年的最后一篇issue, 感谢大家. 本期内容包括 ...

  5. Android Weekly Notes Issue #230

    Android Weekly Notes Issue #230 November 6th, 2016 Android Weekly Issue #230. Android Weekly笔记, 本期内容 ...

  6. Android Weekly Notes Issue #229

    Android Weekly Issue #229 October 30th, 2016 Android Weekly Issue #229 Android Weekly笔记, 本期内容包括: 性能库 ...

  7. Android Weekly Notes Issue #227

    Android Weekly Issue #227 October 16th, 2016 Android Weekly Issue #227. 本期内容包括: Google的Mobile Vision ...

  8. Android Weekly Notes Issue #221

    Android Weekly Issue #221 September 4th, 2016 Android Weekly Issue #221 ARTICLES & TUTORIALS And ...

  9. Android Weekly Notes Issue #219

    Android Weekly Issue #219 August 21st, 2016 Android Weekly Issue #219 ARTICLES & TUTORIALS Andro ...

随机推荐

  1. Qt读写excel

    今天在利用Qt进行excel操作时,代码总是走到打开excel这一步是总是出现程序崩溃.在网上查找了各种帖子  说法不一,尝试都没有解决.后来猜想是不是excel没有激活影响的.发现自己的excel没 ...

  2. std::ios::sync_with_stdio和tie()——给cin加速

    平时在Leetcode上刷题的时候,总能看到有一些题中最快的代码都有这样一段 static const auto init = []() { std::ios::sync_with_stdio(fal ...

  3. mysqlfailover测试

    mysqlfailover是mysql官方用python语言写的一款工具,包含在mysql utilities工具集中.主要作用是保障mysql高可用.他会定时检测节点状态,当master节点不可用时 ...

  4. 七:MYSQL之常用操作符

    前言: 运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算. 常见的运算有数学计算.比较运算.位运算及逻辑运算 一:算数运算符 用于各类数值运算.包括加(+).减(-).乘(*).除( ...

  5. Mac OS 终端强化美化:iterm2 + zsh + oh~my~zsh 设置教程

    为了获得更好的排版效果,文章改用markdown撰写,故重发一次. 前言 mac自带的terminal终端没有文件名高亮等功能,而且界面不是很好看,故今晚学舍友折腾了终端,可以让自己使用起来更加方便, ...

  6. 蓝牙学习(2)USB Adapter

    主要分析一下蓝牙USB Adapter使用USB接口传输HCI包的实现及过程. 参照上面的Bluetooth core system architecture图, 蓝牙USB Adapter作为Blu ...

  7. biological clock

    '''this application aimed to cauculate people's biological block about emotional(28), energy(23),int ...

  8. django第13天(auth组件,forms组件,中间件,csrf)

    django第13天(auth组件,forms组件) auth组件 -auth组件 -auth是什么? -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... -怎么用? -( ...

  9. web开发框架之Django基础

    在脚本中如何进行Django的运行 if __name__ == '__main__': import os import django # 注意路径(当前所在的位置,要加载Django的配置文件) ...

  10. 9-Python基础知识-day1

    Python基础知识-day1 Python 2 和Python 3 的区别: Python2 源码不标准,混乱,重复代码多:#-*-encoding:utf8 -*- 解决python2显示中文的问 ...