当前的 Linux 内核调试技术

Posted

技术标签:

【中文标题】当前的 Linux 内核调试技术【英文标题】:Current Linux Kernel debugging techniques 【发布时间】:2010-12-18 05:58:18 【问题描述】:

Linux 机器在启动和运行软件(包括自定义驱动程序)几小时后就会死机。我正在寻找一种调试此类问题的方法。最近,Linux 内核调试技术有了很大的进步,不是吗?

我恳请分享有关该主题的一些经验。

【问题讨论】:

@tinkertim:你的意思是这还不够? :) 【参考方案1】:

一种选择是使用 Kprobes。在谷歌上快速搜索将显示您需要的所有信息。它不是特别难使用。 Kprobes 是由 IBM 创建的,我相信它是用于内核调试的解决方案。它本质上是一种精致的 printk() 形式,但是它允许您处理使用处理程序插入的任何“断点”。这可能是您正在寻找的东西。您需要做的就是将一个模块写入内核并将其“insmod”到内核中,该模块将处理您在模块中指定的任何“断点”命中。

希望这是一个有用的选择...

【讨论】:

【参考方案2】:

我如何调试这种错误,是在 VirtualBox 中运行我的操作系统,并使用内置的 kgdb 编译内核。然后我在 VirtualBox 上设置了一个串行控制台,以便我可以通过串行控制台 gdb 到 VirtualBox 操作系统内的内核。任何时候操作系统挂起,就像神奇的 sysrq 键一样,我可以在 gdb 上输入 ctrl-c 来停止并了解那个时间点的内核。

通常内核堆栈跟踪很难查明罪魁祸首进程,所以我认为最好的方法仍然是通用的“top”命令,只需查看应用程序日志以查看挂起的原因 - 这需要当然要重启才能看到日志。

【讨论】:

【参考方案3】:

如果您可以在虚拟机中重现问题,确实有一种相当新的 (AFAIK) 技术可能有用:从运行虚拟机的主机调试虚拟机。

例如看这个: Debugging Linux Kernel in VMWare with Windows host

VMware Workstation 7 还支持一项强大的技术,让您可以确定地记录系统执行情况,然后根据需要重放,甚至倒放。因此,一旦系统崩溃,您就可以向后查看当时发生的情况(甚至尝试更改某些内容,看看它是否仍然崩溃)。 IIRC 我在某处读到你不能这样做并同时使用 VMware/gdb 调试内核。

显然,您需要一个 VMM。我不知道除了 VMware 的 VMM 系列之外还有什么 VMM 支持这个,我不知道是否有任何免费的 VMware 版本支持这个。可能不会;不能真的指望一家商业公司免费赠送所有东西。试用版为 30 天。

如果您的自定义驱动程序用于机器内部的硬件,那么我想这可能行不通。

【讨论】:

请注意,这不需要在 VM 内启用任何类型的调试支持;虚拟机本身不受干扰,理论上完全不知道它正在被调试。相反,工作站有一个直接内置在其中的 gdb 存根,用于控制虚拟化 CPU。 如果使用 QEMU/KVM 作为管理程序,我希望这是可能的。【参考方案4】:

根据您要调试的问题类型,有许多不同的技术。在您的情况下,第一个问题是“系统真的冻结了吗?”。您可以启用神奇的 sysrq 键并在冻结时检查系统状态,然后从那里开始。

可能最直接有效的方法是启用内核调试器并通过串行电缆连接到它。

【讨论】:

【参考方案5】:

SystemTap 对 Linux 来说就像 Dtrace 对 Solaris 一样 .. 但是我发现使用它相当不友好。不过,您可能想尝试一下。注意:使用调试信息编译内核并花一些时间使用内核检测挂钩。

这就是为什么这么多人在根据经验将错误缩小到特定模块后仍在使用 printk()。

我不推荐它,只是指出它存在。我可能不够聪明,无法欣赏一些潜在的美......我只是为奇怪的设备编写驱动程序。

【讨论】:

+1 用于引用 SystemTrap。看起来很有希望。我是这些 printk 人中的一员。

以上是关于当前的 Linux 内核调试技术的主要内容,如果未能解决你的问题,请参考以下文章

linux内核调试技术之printk

第十章嵌入式Linux的调试技术

第10章:嵌入式Linux的调试技术

linux内核调试技术之GDB和GDBServer

第十章 嵌入式Linux的调试技术

嵌入式linux的调试技术