クラッシュダンプからプロセスのcoreを切り出す

 以下のWebページを見ていたら、crashコマンドのエクステンションにgcoreというのがあり、クラッシュダンプから実行中のプロセスのcoreを切り出せることがわかった。
  http://people.redhat.com/anderson/

■gcoreエクステンションのインストール
1)ダウンロード
 以下のWebページから、以下のファイルをダウンロードする。
crash extension modules
http://people.redhat.com/anderson/extensions.html
  gcore.c
  gcore.mk
  gcore.tar.bz2
  defs.h

2)アーカイブを展開
$ tar xjf gcore.tar.bz2   <ーーlibgcoreというディレクトリができる
$ ls
defs.h   gcore.mk       libgcore    
gcore.c  gcore.tar.bz2

3)メイクする
$ make -f gcore.mk

 カレントディレクトリに「gcore.so」ができる。
$ ls
defs.h   gcore.mk  gcore.tar.bz2
gcore.c  gcore.so  libgcore

4)gcore.soをcrashコマンドが認識できるディレクトリへコピー
$ sudo mkdir -p /usr/lib/crash/extensions
$ sudo cp gcore.so /usr/lib/crash/extensions/.

 ここでcrashコマンドからgcore.soを読み込ませてみたが、以下のエラーがでた。
crash> extend gcore.so
extend: /usr/lib/crash/extensions/gcore.so: undefined symbol: get_kvm_register_set
crash> q

 crashコマンドの最新版「crash-5.1.9.tar.gz」を上述のcrashのサイトからダウンロードしてインストールしたところ、無事使えるようになった。
 インストールは解凍して make、make install するだけ。
 ただし、既存のcrashコマンドは削除していないので、make installはせず、PATH環境変数にパスを追加して新しい方を使うようにした。

■gcoreエクステンションの使用
 クラッシュダンプを指定してcrashコマンドを起動する。
 なお、クラッシュダンプの取得方法や、crashコマンドを使うための環境設定はクラッシュダンプ関連にまとめてある。
 手順としては、extendサブコマンドでgcore.soをローディングさせた後、対象のpidを指定してgcoreサブコマンドを実行するだけ。
$ crash /boot/System.map-2.6.18-274.7.1.el5 \
        /usr/lib/debug/lib/modules/2.6.18-274.7.1.el5/vmlinux \
        /var/crash/2011-10-22-20\:08/vmcore

crash> extend gcore.so    <--- エクステンションをローディング
/usr/lib/crash/extensions/gcore.so: shared object loaded

crash> ps     <-- psで実行中プロセスのpidを確認。
  PID    PPID  CPU   TASK    ST  %MEM     VSZ    RSS  COMM
   ・・・中略・・・
  6606   6408   1  c9bd9000  RU   0.0    1752    448  writer
  6607   6173   1  f7ceaaa0  RU   0.0    1752    440  reader

crash> gcore 6606    <--- gcoreに対象のpidを指定
gcore: WARNING: page fault at 8f82000
   ・・・中略・・・
gcore: WARNING: page fault at bf8a3000
Saved core.6606.writer

 WARNINGがいっぱいでるが、coreはできた。
$ ls -l core*
-rw------- 1 XXXX XXXX 286720 10月 22 20:18 core.6606.writer

 gdbで見てみると、たしかにcoreができている。
$ gdb ./writer core.6606.writer 
(gdb) bt
#0  0x00d76402 in ?? ()
#1  0x0086ad00 in __nanosleep_nocancel () from /lib/libc.so.6
#2  0x08048d33 in main (argc=2, argv=0xbf8a4f04) at writer.c:137
(gdb) f 2
#2  0x08048d33 in main (argc=2, argv=0xbf8a4f04) at writer.c:137
137                     nanosleep((struct timespec *)&ts, NULL);
(gdb) info locals
key = -771718095
shmid = 5079055
fd = 3
segptr = 0xb7fa9000
seglp = 0xb7fa9000
i = 1237
ret = 9625588
fp = 0x8f81008
opt = -1
flushFlg = 1
syncFlg = 0
syscallFlg = 0
delFlg = 0
ts = {tv_sec = 0, tv_nsec = 100000}


名前:
コメント:



最終更新:2011年10月23日 01:12