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 に保存されている
・よく使うコマンドは以下
かなり強力なツールなのだが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("構造体名", "メンバ名");
構造体中のメンバの構造体先頭アドレスからのオフセットを得る
コメント
コメント一覧 (4)
>(あったら誰か教えて!)
えっ! そんなはずは…。普通にsourceで読み込めるはず。
むかーーし使った覚えがあるなあ。
マクロだとスピード遅いので、Cのモジュールが作れるのなら、
そのほうが早いけど。
いきなり間違いを晒してしまったわ。
ご指摘感謝!
あとでやってみる。
<a href= http://www.angelfire.com/deojja/2.html >94577</a>
http://www.angelfire.com/deojja/1.html
革命の日々
<a href= http://spazioinwind.libero.it/foximanna/foximanna.htm >The residence of Giorgio Piras</a>
http://www.davidesuccidj.com/
革命の日々