Linux内核调试的方式以及工具汇总(下)

电子说

1.3w人已加入

描述

5 Kprobe && systemtap


5.1 内核kprobe机制


kprobelinux 内核的一个重要特性, 是一个轻量级的内核调试工具, 同时它又是其他一些更高级的内核调试工具(比如 perfsystemtap)的 “基础设施”, 4.0版本的内核中, 强大的 eBPF 特性也寄生于 kprobe 之上, 所以 kprobe 在内核中的地位就可见一斑了.

Kprobes 提供了一个强行进入任何内核例程并从中断处理器无干扰地收集信息的接口. 使用 Kprobes 可以收集处理器寄存器和全局数据结构等调试信息。开发者甚至可以使用 Kprobes 来修改 寄存器值和全局数据结构的值.

如何高效地调试内核?

printk 是一种方法, 但是 printk 终归是毫无选择地全量输出, 某些场景下不实用, 于是你可以试一下tracepoint, 我使能 tracepoint 机制的时候才输出. 对于傻傻地放置 printk 来输出信息的方式,tracepoint 是个进步, 但是 tracepoint 只是内核在某些特定行为(比如进程切换)上部署的一些静态锚点, 这些锚点并不一定是你需要的, 所以你仍然需要自己部署tracepoint, 重新编译内核. 那么kprobe 的出现就很有必要了, 它可以在运行的内核中动态插入探测点, 执行你预定义的操作.

它的基本工作机制是 : 用户指定一个探测点, 并把一个用户定义的处理函数关联到该探测点, 当内核执行到该探测点时, 相应的关联函数被执行,然后继续执行正常的代码路径.

kprobe 实现了三种类型的探测点 : kprobes, jprobeskretprobes(也叫返回探测点). 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

5.2 前端工具systemtap


SystemTap 是监控和跟踪运行中的 Linux 内核的操作的动态方法. 这句话的关键词是动态, 因为 SystemTap 没有使用工具构建一个特殊的内核, 而是允许您在运行时动态地安装该工具. 它通过一个Kprobes 的应用编程接口 (API) 来实现该目的.

SystemTap 与一种名为 DTrace 的老技术相似,该技术源于 Sun Solaris 操作系统. 在 DTrace 中, 开发人员可以用 D 编程语言(C 语言的子集, 但修改为支持跟踪行为)编写脚本. DTrace 脚本包含许多探针和相关联的操作, 这些操作在探针 “触发” 时发生. 例如, 探针可以表示简单的系统调用,也可以表示更加复杂的交互,比如执行特定的代码行

DTraceSolaris 最引人注目的部分, 所以在其他操作系统中开发它并不奇怪. DTrace 是在 Common Development and Distribution License (CDDL) 之下发行的, 并且被移植到 FreeBSD 操作系统中.

另一个非常有用的内核跟踪工具是 ProbeVue, 它是 IBMIBM® AIX® 操作系统 6.1 开发的. 您可以使用 ProbeVue 探查系统的行为和性能, 以及提供特定进程的详细信息. 这个工具使用一个标准的内核以动态的方式进行跟踪.

考虑到 DTraceProbeVue 在各自的操作系统中的巨大作用, 为 Linux 操作系统策划一个实现该功能的开源项目是势不可挡的. SystemTap2005 年开始开发, 它提供与 DTraceProbeVue 类似的功能. 许多社区还进一步完善了它, 包括 Red HatIntelHitachiIBM 等.

这些解决方案在功能上都是类似的, 在触发探针时使用探针和相关联的操作脚本.

相关资料链接:

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/

6 kgdb && kgtp


6.1 kgdb


  • KDB 和 KGDB 合并, 并进入内核

KGDB 是大名鼎鼎的内核调试工具, 他是由 KDBKGDB 项目合并而来.

kdb 是一个Linux系统的内核调试器, 它是由SGI公司开发的遵循GPL许可证的开放源码调试工具. kdb 嵌入在Linux 内核中. 为内核&&驱动程序员提供调试手段. 它适合于调试内核空间的程序代码. 譬如进行设备驱动程序调试. 内核模块的调试等.

kgdbkdb 现在已经合并了. 对于一个正在运行的kgdb 而言, 可以使用 gdbmonitor 命令来使用 kdb 命令. 比如

(gdb)gdb monitor ps -A

就可以运行 kdbps 命令了.

分析一下 kdb 补丁和合入主线的 kdb 有啥不同

kdbkgdb 合并之后, 也可以使用 kgdbIO 驱动(比如键盘), 但是同时也 kdb也丧失了一些功能.合并之后的kdb不在支持汇编级的源码调试. 因此它现在也是平台独立的.

  1. kdump和kexec已经被移除。
  2. 从/proc/meninfo中获取的信息比以前少了。
  3. bt命令现在使用的是内核的backtracer,而不是kdb原来使用的反汇编。
  4. 合并之后的kdb不在具有原来的反汇编(id命令)

总结一下 : kdbkgdb 合并之后,系统中对这两种调试方式几乎没有了明显的界限,比如通过串口进行远程访问的时候,可以使用 kgdb 命令, 也可以使用 kdb 命令(使用gdb monitor实现)

6.2 KGTP


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

7 perf


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

8 其他Tracer工具


8.1 LTTng


LTTng 是一个 Linux 平台开源的跟踪工具, 是一套软件组件, 可允许跟踪 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

8.2 eBPF


extended Berkeley Packet Filter(eBPF)是一个可以在事件上运行程序的高效内核虚拟机(JIT)。它可能最终会提供 ftrace 和 perf_events 的内核编程,并强化其他的 tracer。这是 Alexei Starovoitov 目前正在开发的,还没有完全集成,但是从4.1开始已经对一些优秀的工具有足够的内核支持了,如块设备I/O的延迟热图。可参考其主要作者 Alexei Starovoitov 的BPF slides和eBPF samples。

8.3 Ktap


ktap 在过去是一款前景很好的 tracer,它使用内核中的 lua 虚拟机处理,在没有调试信息的情况下在嵌入式设备上运行的很好。它分为几个步骤,并在有一段时间似乎超过了 Linux 上所有的追踪器。然后 eBPF 开始进行内核集成,而 ktap 的集成在它可以使用 eBPF 替代它自己的虚拟机后才开始。因为 eBPF 仍将持续集成几个月,ktap 开发者要继续等上一段时间。我希??今年晚些时候它能重新开发。

8.4 dtrace4linux


dtrace4linux 主要是 Paul Fox 一个人在业余时间完成的,它是 Sun DTrace 的 Linux 版本。它引入瞩目,还有一些 provider 可以运行,但是从某种程度上来说还不完整,更多的是一种实验性的工具(不安全)。我认为,顾忌到许可问题,人们会小心翼翼的为 dtrace4linux 贡献代码:由于当年 Sun 开源DTrace 使用的是 CDDL 协议,而 dtrace4linux 也不大可能最终进入 Linux kernel。Paul 的方法很可能会使其成为一个 add-on。我很乐意看到 Linux 平台上的 DTrace 和这个项目的完成,我认为当我加入 Netflix 后将会花些时间来协助完成这个项目。然而,我还是要继续使用内置的 tracers,如 ftrace 和 perf_events。

8.5 OL DTrace


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(为技术支持付费)有多大兴趣,另一方面取决于它是否完全开源:它的内核元件是开源的,而我没有看到它的用户级别代码。

8.6 sysdig


sysdig是一个使用类tcpdump语法来操作系统事件的新tracer,它使用lua提交进程。它很优秀,它见证了系统跟踪领域的变革。它的局限性在于它只在当前进行系统调用,在提交进行时将所有事件转储为用户级别。你可以使用系统调用做很多事情,然而我还是很希望它能支持跟踪点、kprobe和uprobe。我还期待它能支持eBPF做内核摘要。目前,sysdig开发者正在增加容器支持。留意这些内容。

原文作者:CHENG Jian 原文链接:https://kernel.blog.csdn.net/article/details/68948080

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分