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 と同等のことができる関数があれば、そちらの方がよかったのですが、方法が見つからなかったのでこれに落ち着きました。