电子说
kprobe
是 linux
内核的一个重要特性, 是一个轻量级的内核调试工具, 同时它又是其他一些更高级的内核调试工具(比如 perf
和 systemtap
)的 “基础设施”, 4.0版本的内核中, 强大的 eBPF
特性也寄生于 kprobe
之上, 所以 kprobe
在内核中的地位就可见一斑了.
Kprobes
提供了一个强行进入任何内核例程并从中断处理器无干扰地收集信息的接口. 使用 Kprobes
可以收集处理器寄存器和全局数据结构等调试信息。开发者甚至可以使用 Kprobes
来修改 寄存器值和全局数据结构的值.
如何高效地调试内核?
printk
是一种方法, 但是 printk
终归是毫无选择地全量输出, 某些场景下不实用, 于是你可以试一下tracepoint
, 我使能 tracepoint
机制的时候才输出. 对于傻傻地放置 printk
来输出信息的方式,tracepoint
是个进步, 但是 tracepoint
只是内核在某些特定行为(比如进程切换)上部署的一些静态锚点, 这些锚点并不一定是你需要的, 所以你仍然需要自己部署tracepoint
, 重新编译内核. 那么kprobe
的出现就很有必要了, 它可以在运行的内核中动态插入探测点, 执行你预定义的操作.
它的基本工作机制是 : 用户指定一个探测点, 并把一个用户定义的处理函数关联到该探测点, 当内核执行到该探测点时, 相应的关联函数被执行,然后继续执行正常的代码路径.
kprobe
实现了三种类型的探测点 : kprobes
, jprobes
和 kretprobes
(也叫返回探测点). kprobes
是可以被插入到内核的任何指令位置的探测点, jprobes
则只能被插入到一个内核函数的入口, 而 kretprobes
则是在指定的内核函数返回时才被执行.
相关资料链接:
kprobe工作原理:http://blog.itpub.net/15480802/viewspace-1162094/
随想录(强大的kprobe):http://blog.csdn.net/feixiaoxing/article/details/40351811
kprobe原理解析(一):http://www.cnblogs.com/honpey/p/4575928.html
SystemTap
是监控和跟踪运行中的 Linux
内核的操作的动态方法. 这句话的关键词是动态, 因为 SystemTap
没有使用工具构建一个特殊的内核, 而是允许您在运行时动态地安装该工具. 它通过一个Kprobes
的应用编程接口 (API
) 来实现该目的.
SystemTap
与一种名为 DTrace
的老技术相似,该技术源于 Sun Solaris
操作系统. 在 DTrace
中, 开发人员可以用 D
编程语言(C
语言的子集, 但修改为支持跟踪行为)编写脚本. DTrace
脚本包含许多探针和相关联的操作, 这些操作在探针 “触发” 时发生. 例如, 探针可以表示简单的系统调用,也可以表示更加复杂的交互,比如执行特定的代码行
DTrace
是 Solaris
最引人注目的部分, 所以在其他操作系统中开发它并不奇怪. DTrace
是在 Common Development and Distribution License (CDDL)
之下发行的, 并且被移植到 FreeBSD
操作系统中.
另一个非常有用的内核跟踪工具是 ProbeVue
, 它是 IBM
为 IBM® AIX®
操作系统 6.1
开发的. 您可以使用 ProbeVue
探查系统的行为和性能, 以及提供特定进程的详细信息. 这个工具使用一个标准的内核以动态的方式进行跟踪.
考虑到 DTrace
和 ProbeVue
在各自的操作系统中的巨大作用, 为 Linux
操作系统策划一个实现该功能的开源项目是势不可挡的. SystemTap
从 2005
年开始开发, 它提供与 DTrace
和 ProbeVue
类似的功能. 许多社区还进一步完善了它, 包括 Red Hat
、Intel
、Hitachi
和 IBM
等.
这些解决方案在功能上都是类似的, 在触发探针时使用探针和相关联的操作脚本.
相关资料链接:
SystemTap 学习笔记 - 安装篇:https://segmentfault.com/a/1190000000671438
Linux 自检和 SystemTap 用于动态内核分析的接口和语言:https://www.ibm.com/developerworks/cn/linux/l-systemtap/
Brendan’s blog Using SystemTap:http://dtrace.org/blogs/brendan/2011/10/15/using-systemtap/
内核调试神器SystemTap — 简介与使用(一):http://blog.csdn.net/zhangskd/article/details/25708441
内核探测工具systemtap简介:http://www.cnblogs.com/hazir/p/systemtap_introduction.html
SystemTap Beginner:http://blog.csdn.net/kafeiflynn/article/details/6429976
使用systemtap调试linux内核:http://blog.csdn.net/heli007/article/details/7187748
Ubuntu Kernel Debuginfo:http://ddebs.ubuntu.com/pool/main/l/linux
Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 3 部分: Systemtap:https://www.ibm.com/developerworks/cn/linux/l-cn-systemtap3/
KGDB
是大名鼎鼎的内核调试工具, 他是由 KDB
和 KGDB
项目合并而来.
kdb
是一个Linux系统的内核调试器, 它是由SGI公司开发的遵循GPL许可证的开放源码调试工具. kdb
嵌入在Linux
内核中. 为内核&&驱动程序员提供调试手段. 它适合于调试内核空间的程序代码. 譬如进行设备驱动程序调试. 内核模块的调试等.
kgdb
和 kdb
现在已经合并了. 对于一个正在运行的kgdb
而言, 可以使用 gdbmonitor
命令来使用 kdb
命令. 比如
(gdb)gdb monitor ps -A
就可以运行 kdb
的 ps
命令了.
分析一下 kdb
补丁和合入主线的 kdb
有啥不同
kdb
跟 kgdb
合并之后, 也可以使用 kgdb
的IO
驱动(比如键盘), 但是同时也 kdb
也丧失了一些功能.合并之后的kdb
不在支持汇编级的源码调试. 因此它现在也是平台独立的.
总结一下 : kdb
和 kgdb
合并之后,系统中对这两种调试方式几乎没有了明显的界限,比如通过串口进行远程访问的时候,可以使用 kgdb
命令, 也可以使用 kdb
命令(使用gdb monitor实现)
KGTP
是一个 实时 轻量级 Linux
调试器 和 跟踪器. 使用 KGTP
使用 KGTP
不需要在 Linux
内核上打 PATCH
或者重新编译, 只要编译KGTP模块并 insmod
就可以.
其让 Linux
内核提供一个远程 GDB
调试接口, 于是在本地或者远程的主机上的GDB可以在不需要停止内核的情况下用 GDB tracepoint
和其他一些功能 调试 和 跟踪 Linux
.
即使板子上没有 GDB
而且其没有可用的远程接口, KGTP
也可以用离线调试的功能调试内核(见http://code.google.com/p/kgtp/wiki/HOWTOCN#/sys/kernel/debug/gtpframe和离线调试)。
KGTP支持 X86-32 , X86-64 , MIPS 和 ARM 。
KGTP在Linux内核 2.6.18到upstream 上都被测试过。
而且还可以用在 Android 上(见 http://code.google.com/p/kgtp/wiki/HowToUseKGTPinAndroid)
相关资料链接:
github-KGTP:https://github.com/teawater/kgtp
KGTP内核调试使用:http://blog.csdn.net/djinglan/article/details/15335653
KGTP中增加对GDB命令“set trace-buffer-size”的支持 - Week 5:http://blog.csdn.net/calmdownba/article/details/38659317
Perf
是用来进行软件性能分析的工具。
通过它, 应用程序可以利用 PMU
, tracepoint
和内核中的特殊计数器来进行性能统计. 它不但可以分析指定应用程序的性能问题 (per thread
). 也可以用来分析内核的性能问题, 当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈.
最初的时候, 它叫做 Performance counter
, 在 2.6.31
中第一次亮相. 此后他成为内核开发最为活跃的一个领域. 在 2.6.32
中它正式改名为 Performance Event
, 因为 perf
已不再仅仅作为 PMU
的抽象, 而是能够处理所有的性能相关的事件.
使用 perf
, 您可以分析程序运行期间发生的硬件事件,比如 instructions retired
, processor clock cycles
等; 您也可以分析软件事件, 比如 Page Fault
和进程切换。
这使得 Perf
拥有了众多的性能分析能力, 举例来说,使用 Perf
可以计算每个时钟周期内的指令数, 称为 IPC
, IPC
偏低表明代码没有很好地利用 CPU
.
Perf
还可以对程序进行函数级别的采样, 从而了解程序的性能瓶颈究竟在哪里等等. Perf
还可以替代 strace
, 可以添加动态内核 probe
点. 还可以做 benchmark
衡量调度器的好坏.
人们或许会称它为进行性能分析的”瑞士军刀”, 但我不喜欢这个比喻, 我觉得 perf
应该是一把世间少有的倚天剑.
金庸笔下的很多人都有对宝刀的癖好, 即便本领低微不配拥有, 但是喜欢, 便无可奈何. 我恐怕正如这些人一样, 因此进了酒馆客栈, 见到相熟或者不相熟的人, 就要兴冲冲地要讲讲那倚天剑的故事.
相关资料链接:
Perf – Linux下的系统性能调优工具,第 1 部分:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html
perf Examples:http://www.brendangregg.com/perf.html
改进版的perf, Performance analysis tools based on Linux perf_events (aka perf) and ftrace:https://github.com/brendangregg/perf-tools
Perf使用教程:http://blog.chinaunix.net/uid-10540984-id-3854969.html
linux下的内核测试工具——perf使用简介:http://blog.csdn.net/trochiluses/article/details/10261339
perf 移植:http://www.cnblogs.com/helloworldtoyou/p/5585152.html
LTTng
是一个 Linux
平台开源的跟踪工具, 是一套软件组件, 可允许跟踪 Linux
内核和用户程序, 并控制跟踪会话(开始/停止跟踪、启动/停止事件 等等). 这些组件被绑定如下三个包 :
相关资料链接:
Linux 平台开源的跟踪工具:LTTng:http://www.open-open.com/lib/view/open1413946397247.html
用 lttng 跟踪内核:http://blog.csdn.net/xsckernel/article/details/17794551
LTTng and LTTng project:http://blog.csdn.net/ganggexiongqi/article/details/6664331
extended Berkeley Packet Filter(eBPF)是一个可以在事件上运行程序的高效内核虚拟机(JIT)。它可能最终会提供 ftrace 和 perf_events 的内核编程,并强化其他的 tracer。这是 Alexei Starovoitov 目前正在开发的,还没有完全集成,但是从4.1开始已经对一些优秀的工具有足够的内核支持了,如块设备I/O的延迟热图。可参考其主要作者 Alexei Starovoitov 的BPF slides和eBPF samples。
ktap 在过去是一款前景很好的 tracer,它使用内核中的 lua 虚拟机处理,在没有调试信息的情况下在嵌入式设备上运行的很好。它分为几个步骤,并在有一段时间似乎超过了 Linux 上所有的追踪器。然后 eBPF 开始进行内核集成,而 ktap 的集成在它可以使用 eBPF 替代它自己的虚拟机后才开始。因为 eBPF 仍将持续集成几个月,ktap 开发者要继续等上一段时间。我希??今年晚些时候它能重新开发。
dtrace4linux 主要是 Paul Fox 一个人在业余时间完成的,它是 Sun DTrace 的 Linux 版本。它引入瞩目,还有一些 provider 可以运行,但是从某种程度上来说还不完整,更多的是一种实验性的工具(不安全)。我认为,顾忌到许可问题,人们会小心翼翼的为 dtrace4linux 贡献代码:由于当年 Sun 开源DTrace 使用的是 CDDL 协议,而 dtrace4linux 也不大可能最终进入 Linux kernel。Paul 的方法很可能会使其成为一个 add-on。我很乐意看到 Linux 平台上的 DTrace 和这个项目的完成,我认为当我加入 Netflix 后将会花些时间来协助完成这个项目。然而,我还是要继续使用内置的 tracers,如 ftrace 和 perf_events。
Oracle Linux DTrace为了将 DTrace 引入 Linux,特别是 Oracle Linux,做出了很大的努力。这些年来发布的多个版本表明了它的稳定进展。开发者们以一种对这个项目的前景看好的态度谈论着改进 DTrace 测试套件。很多有用的 provider 已经完成了,如:syscall, profile, sdt, proc, sched 以及USDT。我很期待 fbt(function boundary tracing, 用于内核动态跟踪)的完成,它是 Linux 内核上非常棒的 provider。OL DTrace 最终的成功将取决于人们对运行 Oracle Linux(为技术支持付费)有多大兴趣,另一方面取决于它是否完全开源:它的内核元件是开源的,而我没有看到它的用户级别代码。
sysdig是一个使用类tcpdump语法来操作系统事件的新tracer,它使用lua提交进程。它很优秀,它见证了系统跟踪领域的变革。它的局限性在于它只在当前进行系统调用,在提交进行时将所有事件转储为用户级别。你可以使用系统调用做很多事情,然而我还是很希望它能支持跟踪点、kprobe和uprobe。我还期待它能支持eBPF做内核摘要。目前,sysdig开发者正在增加容器支持。留意这些内容。
原文作者:CHENG Jian 原文链接:https://kernel.blog.csdn.net/article/details/68948080
全部0条评论
快来发表一下你的评论吧 !