仕事のことを書いてみる
gprofだとCPU時間しか取れない。今まではそれで困ったことは無かったんだけど、DBへのアクセスが実行時間の90%を占めるようなプログラムではまったく役に立たない。プラットフォームがLinuxなら色々と代替ツールがあるっぽいんだけど、Solaris/SPARCとなると全然見付からん。Solaris10ならDTraceってのがあるけど、当方Solaris9だし。
んで、gccに-finstrument-functionsっつーオプションがあることを知り、これはいいじゃん、と。この機能を使ったプロファイラを探してみたら、cprofとFunctionCheckが見付かった。cprofはモロにLinux/x86依存で使えなかったので、FunctionCheckを使ってみることに。
- _initと_finiがsparc-sun-solaris2.9-gccのスタートアップと衝突するので、__attribute__( (constructor) )で代用する
- unalignedメモリアクセスでBus errorで落ちる(SPARCも駄目なのね)のを修正
- fc_managerとの共有メモリ通信が不安定で途中で落ちたりしつつもたまに完走する
- 完走してもプロファイル結果の関数アドレス上位32ビットが欠落している
- 結果を見ようとfcdumpを走らせたらlibbfdの中でsegfaultする(結局解決出来なかったのでpythonで代わりのツールを作った)
とまぁ色々と大変だった。-finstrument-functionsを知った時点でプロファイラを自作したほうが早かったのではないか、というぐらいに。
FunctionCheck 1.4のほうが安定してるっぽいのでこっちにしよう。