クラッシュダンプからプロセスのcoreを切り出す
■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