2009-11-19 111 views
18

Linux机器在引导和运行软件(包括自定义驱动程序)几个小时后冻结。我正在寻找调试此类问题的方法。最近,Linux内核调试技术已经取得重大进展,不是吗?当前的Linux内核调试技术

我恳请分享一些关于这个话题的经验。

+0

@tinkertim:你的意思是它是不够的? :) – leppie 2009-11-20 19:46:25

回答

5

SystemTap似乎是到Linux什么Dtrace是Solaris ..但我觉得它使用相当敌意。不过,你可能想尝试一下。注意:用调试信息编译内核并花费一些时间处理内核工具钩子。

这就是为什么这么多人仍然使用printk()后经验地缩小到特定模块的bug。

我不推荐它,只是指出它存在。我可能没有足够的智慧来欣赏一些潜在的美。我只是写奇怪设备的驱动程序。

+1

+1为SystemTrap的参考。看起来很有希望。我是这些印刷人员之一。 – dmeister 2010-01-31 16:22:22

2

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

也许最直接强大的方法是启用内核调试程序并通过串行电缆连接到它。

6

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

例如见这样的: Debugging Linux Kernel in VMWare with Windows host

的VMware Workstation 7还实现了强大的技术,确定性让你记录制度执行,然后重播,并根据需要,甚至倒退。所以一旦系统崩溃,你可以倒退,看看发生了什么(甚至尝试改变一些东西,看看它是否仍然崩溃)。 IIRC我在某处读不到,无法同时使用VMware/gdb调试内核。

显然,您需要一个VMM。我不知道VMware的VMM系列支持VMM是什么,我不知道是否有免费的VMware版本支持这个功能。不可能;人们无法真正期望一家商业公司免费赠送所有东西。试用版是30天。

如果您的自定义驱动程序是针对机器内部的硬件,那么我想这可能无法正常工作。

+0

注意,这并不要求在虚拟机内启用任何类型的调试支持; VM本身不受干扰,理论上完全不知道它正在被调试。相反,工作站有一个直接构建在其中的gdb存根控制虚拟CPU。 – Paul 2010-02-12 23:07:30

0

我如何调试这种类型的bug,是在VirtualBox中运行我的操作系统,然后用kgdb内建编译内核。然后我在VirtualBox上设置一个串行控制台,这样我就可以通过串行控制台将gdb连接到VirtualBox操作系统内的内核。任何时候操作系统挂起,就像神奇的sysrq键一样,我可以在gdb上输入ctrl-c来停止并理解当时的内核。

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

0

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

希望可以成为一个有用的选择...