AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

KGTP, Linux内核中的GDB快刀 by 朱辉

发布者 linux
发布于 1432254256193  浏览 6812 关键词 Linux 
分享到

第1页

KGTP, Linux 内核中的 GDB 快刀 kgtp.googlecode.com

朱辉 (teawater@gmail.com)



第2页

什么是 KGTP ?

● KGTP 是 Linux kernel GDB tracepoint module 。

● KGTP 是一个 灵活 轻量级 实时 Linux 调试器 和 跟踪器 。

● 处理在线服务器上的问题。 ● 处理嵌入式系统中的问题。 ● 被一些公司使用,最主要的是在去年 1 月合入了

alibaba(taobao) 的内核 tree 。



第3页

轻量级 代码轻量级

● 主要是开发者利用业余时间维护,所以是一个轻量级 的项目。

● 因为分析数据主要使用 GDB 所以不需要很多数据分析 代码。

另:因为对 GDB 的依赖,所以 http://code.google.com/p/gdbt/ 提 供 GDB for KGTP 支持。 x86_64 和 i386 的 static GDB 下载,还提 供 Ubuntu PPA , Opensuse 源支持, Ubuntu, fedora, debian 等软 件都可支持直接安装。

● KGTP 20130915: gtp.c 大小 277K 13045 行



第4页

轻量级 实现轻量级

● 大部分 trace 功能基于 Kprobe 。

Kprobes-optimization 还可提高 kprobe 的速度。

● 所以大部分时间,使用 KGTP 不需要重新编译内 核。只需要编译 KGTP 模块和 insmod 。

● 当不需要 KGTP 的时候,只需要 rmmod 。跟什 么也没发生一样。



第5页

实时



Tracer



● 不停止 Linux 内核 ● 不能被 GDB 控制





第6页

实时



● 将停止 Linux 内核 ● 可以被 GDB 控制



Debuger





第7页

实时

Tracer Debuger



KGTP

不停止 Linux 内核 可以被本地或者远程的 GDB 控制





第8页

演示助手



第9页

实时 演示

● 演示 1 :直接访问 Linux 内核中的变量 ● 演示 2 : trace 内核 ● 演示 3 :直接访问用户程序的内存 ● 演示 4 : trace 用户程序 ● 演示 5 : trace 用户程序的系统调用



第10页

灵活 对内核的支持灵活

● 灵活算是轻量级引入的带来的优点。

● 大部分时候,使用 KGTP 不需要 在 Linux 内核上打 PATCH 或者重新编译,只要编译 KGTP 模块并 insmod 就可以。

● 支持 X86-32 , X86-64 , MIPS 和 ARM 。 ● 支持 Linux 内核 2.6.18 到 upstream 。 ● 支持 Android :

演示 6 :连接 Android 中的 KGTP 。



第11页

灵活 连接方式灵活

● 从本机 GDB 连接 KGTP 。 ● 从远程主机 GDB 连接 KGTP 。

● GDB 不连接 KGTP - 离线调试。 演示 7 :在 Android 上离线调 试。



第12页

灵活 灵活的设置 tracepoint

● 灵活的在不同的地址设置 tracepoint 包括 inline 函数中。

● 用 tracepoint actions 可以设置 tracepoint 被触发后的行为。

● 用 tracepoint condition 可以设置 tracepoint 被触发的条件。



第13页

灵活 灵活的 trace 状态变量 (TSV)

● Trace 状态变量 (TSV) 是 GDB tracepoint 的子功能。

● TSV 可以被用户或者调试目标 (KGTP) 定义。

● TSV 的值从 KGTP 中取得。 ● GDB 可以在任何时候读 TSV 的值。

tracepoint actions 可以访问 TSV 的 值。



第14页

KGTP 中的 TSV

● 用户可以定义普通 TSV. ● 用户可以定义普通 per-CPU TSV. ● KGTP 定义了很多特殊 TSV 支持一些特殊功

能,例如 $bt , $current_task_pid 。 ● 用户可以用插件增加 TSV 到 KGTP 中,这样

KGTP 可以调用内核中的任何函数并且取得返回 值。 演示 8: 演示 KGTP 中的插件。



第15页

灵活

● 演示 8 这个例子记录了每个 CPU 上关闭 IRQ 时间最长 的函数的 stack dump 。



第16页

灵活 灵活的数据处理方式 python

● GDB 支持 PYTHON 脚本。 ● 演示 9 :在演示 8 取得的 trace frame 中用

python 脚本找出每个 CPU 最慢的 frame id 。



第17页

灵活 直接将数据输出到系统日志

● KGTP 可以通过特殊格式的 action 命令输出数 据到系统日志。

● 其结合离线调试功能让调试更加方便。



第18页

Watch tracepoint

● Watch tracepoint 可以控制硬件断点记录 Linux kernel 的内存访问。 X86 支持这个功 能。

● 演示 10: 静态 watch tracepoint. ● 演示 11: 动态 watch tracepoint.



第19页

单步和反向执行调试

● 使用 while-stepping 让 Linux 内核做单步。 并用 GDB 执行命令(包括反向调试命令)回放 traceframe 。 演示 12: 做单步和回放 traceframe 。



第20页

Python script



KGTP 的结构



Target remote



memory others regs



GDBRSP

Tfile format Target tfile GDB



SYSFS KGTP



Kprobe



Ring buffer of KGTP Linux Kernel



第21页

URL

● 主页 http://kgtp.googlecode.com ● 中文 Howto

http://code.google.com/p/kgtp/wiki/HOWTOCN https://raw.github.com/teawater/kgtp/master/ kgtpcn.pdf ● 邮件列表 http://www.freelists.org/list/kgtp ● 我的信箱 teawater@gmail.com ● Irc.freenode.net #hellogcc teawater



第22页

谢谢! 问题?



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。