linuxのカーネルダンプ解析に使うcrashというコマンドがある。
かなり強力なツールなのだがgdbと違ってマクロ機能はないっぽい
(あったら誰か教えて!)

で、仕事上、すごーーーく、長大なリスト構造をダンプ解析することになり、手動で調べるのを断念。プラグインを作ってみた
(crashのプラグラインがナニモノかはcrashコマンドプロンプトで crash> help extend と打てば分かるよん)

最初、かなり舐めてたのだが、結構苦労した。
完全ドキュメント0でつね。これ(´・ω・`)

以下、備忘録
・pluginのスケルトンはcrashに付属するecho.c から拝借すると良い
ポイントはいか
- defs.h のインクルードは必須(defs.hはcrashのソースに付属)
- struct command_table_entry の配列を定義する事により、コマンド定義される
- _init(), _fini()はだまってコピー&ペーストするように。 extend echo.so で_init()が呼ばれ、extend -u echo.soで_fini()が呼ばれる
- コマンド引数はグローバル変数 argcnt, args に保存されている
・よく使うコマンドは以下

- fprintf(fp, "") 
crash端末への出力はグローバル変数fp(この名前は決めうち)にfprintfする
- symbol_value("シンボル")
文字列で与えられたシンボル(グローバル変数名または関数名)からアドレスを返す
- readmem(addr, addr_type, buf, size, "エラー文字列", エラー処理タイプ);
アドレスをあたえて、そのアドレスの値を読む。
典型的にはsymbol_value()の復帰値を与える
addr readするアドレス
addr_type
UVADDR:    ユーザ空間仮想アドレス
KVADDR:    カーネル空間仮想アドレス(普通は常にこれで十分)
PHYSADDR:   物理アドレス
XENMACHADDR: XENでのマシンアドレス
buf 結果格納バッファ
size readサイズ
エラー文字列:    addrが不正などでエラー発生時にこの文字列が表示される
エラー処理タイプ
FAULT_ON_ERROR: 異常時にcrash>プロンプトに強制復帰
(常にこれで実用上は十分)
QUIET|FAULT_ON_ERROR:  上と同じだが、メッセージが出ない(らしい)
RETURN_ON_ERROR:    異常時に関数が0を返す(成功時は1)
QUIET|RETURN_ON_ERROR: 上と同じだが、メッセージが出ない(らしい)  
- STRUCT_SIZE("構造体名")
構造体名から構造体のサイズを得る。配列を処理するときに使う
- MEMBER_OFFSET("構造体名", "メンバ名");
構造体中のメンバの構造体先頭アドレスからのオフセットを得る