Google codeに coredumperというプロジェクトがあります。
gcoreのように、プロセスを止めずにcoreを取得するためのライブラリです。
shとは関係ありませんが、core取得ということでここに使いかたを書いておきます。
■インストール
http://code.google.com/p/google-coredumper/からダウンロードし、適当なところに展開します。試したときは coredumper-1.2.1.tar.gz が最新でした。
展開した中のINSTALLファイルにインストール方法がかかれていますが、Linuxの標準的なconfigure、make、make installのパターンでインストール可能です。
なお、以下のようにするとdebパッケージやrpmパッケージも作れるということで、make installはせずに、make rpm をして、rpmを作成してインストールしました。
`make deb` - builds Debian packages
`make rpm` - build RedHat RPM packages
rpmの作成先はmake rpmした際に表示されます。
$ make rpm
・・・
The rpm package file(s) are located in /home/test/Soft/develop/coredumper-1.2.1/packages/rpm-unknown
$ ls /home/tomonari/Soft/develop/coredumper-1.2.1/packages/rpm-unknown
coredumper-1.2.1-1.x86_64.rpm coredumper-devel-1.2.1-1.x86_64.rpm
coredumper-debuginfo-1.2.1-1.x86_64.rpm
coredumperはライブラリであり、プログラムから呼び出すためにはヘッダファイルも必要なため、以下の2つをインストールしました。
$ sudo rpm -ivh coredumper-1.2.1-1.x86_64.rpm
$ ls /usr/lib/libcoredumper*
/usr/lib/libcoredumper.a /usr/lib/libcoredumper.so.1
/usr/lib/libcoredumper.la /usr/lib/libcoredumper.so.1.0.0
/usr/lib/libcoredumper.so
$ sudo rpm -ivh coredumper-devel-1.2.1-1.x86_64.rpm
$ ls /usr/include/google
coredumper.h
■使いかた
Webページに以下のように出ています。coredumper.hをincludeして、coreを取得したいところでWriteCoreDump(coreファイル名)とするだけですね。
<google/coredumper.h>
...
WriteCoreDump('core.myprogram');
/* Keep going, we generated a core file,
* but we didn't crash.
*/
■サンプル
ソース
<stdio.h>
<stdlib.h>
<string.h>
<errno.h>
<google/coredumper.h>
int main(){
char *str;
short svar;
int ret,err;
str = "Hello World";
svar = 0x1234;
ret = WriteCoreDump("core.test");
err = errno;
if ( ret == -1 ){
strerror( err );
exit(1);
}
printf("WriteCoreDump Success!! ret: %d\n",ret);
exit(0);
}
コンパイル・リンク
$ gcc -o main main.c -lcoredumper -g <-- libcoredumperのリンクが必要、-gはgdbで変数の値をみるため
実行
$ ./main
WriteCoreDump Success!! ret: 0
$ ls core.test
core.test
$ gdb -c core.test main <--本当にcoreが見られるか実験
・・・
(gdb) bt
#0
0x00002b9b483a5825 in WriteCoreDump () from /usr/lib/libcoredumper.so.1
#1
0x0000000000400628 in main () at main.c:16
(gdb) up
#1
0x0000000000400628 in main () at main.c:16
16 ret = WriteCoreDump("core.test");
(gdb) p str
$1 = 0x400768 "Hello World"
(gdb) p /x svar
$2 = 0x1234
なお、coredumperの こことか ここを見ると、APIの説明があります。core取得時に圧縮もできたりするようです。
|