assert(0)をフックしてcore dumpを出力する
assert(0)をフックしてcore dumpを出力するコードを試しに書いてみました。
http://github.com/BlueSkyDetector/code-snippet/tree/master/assert_coredump
ビルド方法
先にGoogle CoreDumperをインストールしておくこと。
http://code.google.com/p/google-coredumper/
その後、githubから取得したコードから、以下コマンドで assert_coredump.so を作成する。
$ gcc -fPIC -O0 -shared -g -o assert_coredump.so assert_coredump.c -ldl
以上。
使用方法
例えば、以下のようなC言語のコード hello_main.c があるとします。
#include <stdio.h> #include <assert.h> int main(){ puts("hello world"); assert(0); }
これをコンパイルして実行すると通常は以下のような出力になります。
$ ./hello_main hello world hello_main: hello_main.c:6: main: Assertion `0' failed. Aborted
ここで、上記でビルドした assert_coredump.so を LD_PRELOAD でプリロードしてやると、この hello_main のバイナリを変更せずに、assert(0) が発行されている時点で core dump を取得できます。
$ LD_PRELOAD=./assert_coredump.so ./hello_main hello world ######################################### Generating CoreDump at assert()!! ######################################### hello_main: hello_main.c:6: main: Assertion `0' failed. Aborted $ ls assert_*.core assert_9699.core
注意点として、core dumpする際に Google CoreDumper を利用しているので、事前にインストールしておく必要があります。
gcore と同等のことができる関数があれば、そちらの方がよかったのですが、方法が見つからなかったのでこれに落ち着きました。