首先准备 linux 内核编译环境:
sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge kernel-package
sudo apt-get build-dep linux
sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev asciidoc binutils-dev
检出带有 utrace 补丁的官方内核代码,并生成对应 Ubuntu 当前版本内核(3.0)的补丁:
git clone https://github.com/utrace/linux.git utrace-linux-git
cd utrace-linux-git/
git checkout -b utrace-3.0 origin/utrace-3.0
git diff v3.0 > /tmp/utrace.patch
获得 Ubuntu 定制内核代码,并打上 utrace 补丁:
sudo apt-get install linux-source
tar xjf /usr/src/linux-source-3.0.0.tar.bz2
cd linux-source-3.0.0/
patch -p1 < /tmp/utrace.patch
输出为:
1 | patching file Documentation/DocBook/Makefile |
注意 kernel/fork.c
的补丁失败了,看看 kernel/fork.c.rej
:
1 | --- kernel/fork.c |
修改 kernel/fork.c
,在 free_task
函数的 ftrace_graph_exit_task(tsk);
之后手工加上这行 tracehook_free_task
调用即可。
编译新的内核,使用当前系统内核的配置参数作为基准,开启 utrace 补丁提供的 CONFIG_UTRACE 功能即可:
1 | cp /boot/config-$(uname -r) .config |
出现如下提示时回答 y: Infrastructure for tracing and debugging user processes (UTRACE) [N/y/?] (NEW)
1 | make-kpkg clean |
这里指定编译内核时的并发任务数,设置为核数+1即可
1 | fakeroot make-kpkg --initrd --append-to-version=-utrace binary-arch |
编译完成后,在 linux-source-3.0.0/
的上级目录会生成 linux-headers/image/debug-symbol 的 deb 安装包,直接用 sudo dpkg -i *.deb
安装即可。重启后选择新内核进入即可用 SystemTap 进行用户态程序跟踪。