技術的雑談-アプリケーションのコアダンプを取る
環境
Linux Fedoracore3で確認
目的
指定したプロセス(アプリケーション)のdump(core)をshell scriptなどから取得する
方法
UNIXで実行中のプロセス(≒プログラム)のメモリーダンプをデバッグなどの用途で取りたい場合、UNIX標準の以下のコマンドを使えば取得できます。
gcore -s -c [ダンプの保存先ファイル名] [pid] [ダンプの保存先ファイル名] -- メモリー状態のファイルをどこに出力するか [pid] -- メモリダンプを取りたいプロセスのプロセスID
尚、-sは「プロセスを一時停止し、コアダンプ取得後に再開する」というオプションです。
プロセスID(pid)は
- 「ps」コマンドで探す
- /proc/〜 以下を探す
- /var/run/〜 以下を探す
の方法で取得できます。 (多分psコマンドで探すのが人間の一般、プログラムが特定できている場合は/var/run以下で探すのがshell scriptでの一般)
ちなみに、psコマンドを叩くと、そのユーザ権限で起動しているプロセスの一覧が表示されます。
[ahouser@localhost ~]$ ps PID TTY TIME CMD 10204 pts/1 00:00:00 bash 10245 pts/1 00:00:00 ps [ahouser@localhost ~]$
また、「ps ax」とやると、そのマシン全体のプロセス一覧が取れます。
同じく、/var/runの様子の例は
[ahouser@localhost run]$ ls -l 合計 100 -rw-r--r-- 1 root root 5 5月 13 10:09 apmd.pid -rw-r--r-- 1 root root 5 5月 13 10:12 atd.pid drwxr-xr-x 2 root root 4096 5月 13 10:13 console -rw------- 1 root nwops 9 5月 13 10:13 console.lock -rw-r--r-- 1 root root 5 5月 13 10:12 crond.pid drwxr-xr-x 2 root root 4096 5月 13 10:12 dbus -rw-r--r-- 1 root root 5 5月 13 10:12 gdm.pid -rw-r--r-- 1 root root 5 5月 13 10:12 gpm.pid -rw------- 1 root root 5 5月 13 10:08 klogd.pid -rw-r--r-- 1 root root 5 5月 13 10:12 messagebus.pid drwxrwx--- 2 named named 4096 10月 18 2003 named drwxrwxr-x 2 root root 4096 10月 29 2003 netreport -rw-r--r-- 1 root root 4 5月 13 10:09 ntpd.pid -rw-r--r-- 1 rpcuser rpcuser 5 5月 13 10:09 rpc.statd.pid drwxr-xr-x 2 root root 4096 10月 24 2003 saslauthd -rw------- 1 root smmsp 33 5月 13 10:11 sendmail.pid -rw-r--r-- 1 smmsp smmsp 50 5月 13 10:12 sm-client.pid -rw-r--r-- 1 root root 5 5月 13 10:09 sshd.pid drwx------ 5 root root 4096 3月 23 15:47 sudo -rw------- 1 root root 5 5月 13 10:08 syslogd.pid -rw-rw-r-- 1 root utmp 11136 5月 15 17:25 utmp -rw-r--r-- 1 root root 6 5月 13 10:12 xfs.pid -rw-r--r-- 1 root root 5 5月 13 10:09 xinetd.pid [ahouser@localhost run]$
です。 UNIXの礼儀正しいプログラミングスタイルで書かれたプログラム(主に、マシンで1つだけ起動されていることが望まれるデーモンなど)は/var/runに「自分の名前.pid」というテキストファイルに自分のプロセスIDを書き込んで起動します。
/proc/以下で探す方法は良くわかりませんが、cd /procしてlsで見ると、プロセスIDでディレクトリが掘れています。その下に「cmdline」というファイルがあるので、その中身がそのプロセスのプログラム名っぽいです。
(まあ、あんまり使わないと思われますので省略)
履歴
2005/7/14 -- 初版
技術的雑談へ戻る