Kernelのコアダンプファイルを解析するのに、crashコマンドが便利だという話を聞いたので、練習として触ってみました。

手元にCentOS 5のマシンがあるので、それを使います。

解析にあたってkernelのデバッグ情報がいるので、debuginfoのRPMをインストールします1

 $ uname -a
Linux localhost.localdomain 2.6.18-128.1.16.el5 #1 SMP Tue Jun 30 06:10:28 EDT 2009 i686 i686 i386 GNU/Linux

 $ wget http://debuginfo.centos.org/5/i386/kernel-debuginfo-2.6.18-128.1.16.el5.i686.rpm
 $ wget http://debuginfo.centos.org/5/i386/kernel-debuginfo-common-2.6.18-128.1.16.el5.i686.rpm
 $ rpm -ivh kernel-debuginfo-common-2.6.18-128.1.16.el5.i686.rpm kernel-debuginfo-2.6.18-128.1.16.el5.i686.rpm

んで、crashコマンド実行。
SVR4 UNIXのcrashコマンドをベースにGDBを統合したやつだそうで2、GDBになじんでる私には結構使いやすいです。

CODE:
  1. $ crash
  2.       KERNEL: /usr/lib/debug/lib/modules/2.6.18-128.1.16.el5/vmlinux
  3.     DUMPFILE: /dev/crash
  4.         CPUS: 1
  5.         DATE: Mon Jul 13 02:17:05 2009
  6.       UPTIME: 06:52:42
  7. LOAD AVERAGE: 0.16, 0.03, 0.01
  8.        TASKS: 86
  9.     NODENAME: localhost.localdomain
  10.      RELEASE: 2.6.18-128.1.16.el5
  11.      VERSION: #1 SMP Tue Jun 30 06:10:28 EDT 2009
  12.      MACHINE: i686  (1197 Mhz)
  13.       MEMORY: 758.9 MB
  14.          PID: 3848
  15.      COMMAND: "crash"
  16.         TASK: ef67c000  [THREAD_INFO: d9120000]
  17.          CPU: 0
  18.        STATE: TASK_RUNNING (ACTIVE)
  19.  crash> set 1
  20.     PID: 1
  21. COMMAND: "init"
  22.    TASK: c16f5aa0  [THREAD_INFO: c16f6000]
  23.     CPU: 0
  24.   STATE: TASK_INTERRUPTIBLE
  25.  crash> p $tmp = jiffies
  26.   $1 = 24873000
  27.  crash> x modprobe_path
  28.   0xc0680be0 <modprobe_path>:     das
  29.  crash> show convenience
  30.    $tmp = 24873000
  31.    $__ = void
  32.    $_ = (examine_i_type *) 0xc0680be0 "/sbin/modprobe"
  33.  crash> exit

gdbスクリプトをsourceで読み込むこともできる。
まだ、まともな使い方は全然してないけど、Debug Hacksにいろいろ書いてあるので、それを読みながらやる予定。

  1. 最初、yumでinstallしたら、なぜか2.6.18-92.1.6.el5.centos.plusが入りました。kernelバージョンと合ってないので、rpmコマンドで入れなおし。 []
  2. Crash WhitepaperのAbstract参照 []