ls -l のコールグラフ

GCC-4.6の stack-usageを使ってみた - syohex’s diary

コールグラフを組み合わせて何かできないかなって思ったんだけど、
今のところ何もできませんでした。コールグラフの図だけ作ったので
勿体ないので貼っておきます。

環境

Ubuntu 10.10 x86_64

ソース

coreutils-8.10を使いました。
ソースは src/{ls.c,ls-ls.c}です。

作り方

一旦coreutilsを作成してあとで個別にコンパイルします。
make時に自動生成するファイルがあり、lsのソースだけでは
ビルドできないためです。

  % ./configure
  % make
  % cd src
  % gcc -std=c99 -g -pg -O2 -I. -fstack-usage -I../lib \
  ls.c ls-ls.c ../lib/libcoreutils.a version.c -lrt

これで a.outができました。

コールグラフの作成

以下のコマンドで作りました。

  % valgrind --tool=callgrind ./a.out -l
  # callgrind.out.PIDが生成される
  % kcachegrind callgrind.out.PID

kcachegrindから画像を得る方法は

Devel::NYTProfからコールグラフを生成する - syohex’s diary

を参照してください。

イメージ

イメージは以下の通り

送信者 blog

思ったほどは複雑じゃないかな。
まあオプションをもっと増やすと複雑になるんだろうけど。

まとめ

fstack-usageとコールグラフを使って何かできるんじゃないって
思ったけど、今のところ何もできなかったので図だけ貼りました。


今回思ったのは、PC環境ではスタック使用量全体を把握するのは
難しいということです。やっぱりライブラリに依存している部分が
多いから、自分の書いた範囲はあんまりスタック使っていないと
しても、実はライブラリで使っているという場合にあんまり意味がなく
嬉しくないかなと。無意味では全然ないんですがね。

まあ PC環境だとメモリリークなんかはともかく、ローカル変数を
がっつり確保してもそこまで問題じゃないので、どちらかというと
組み込み向けの機能だと思いました。


gprofとかとうまく組み合わせられないかなというのは
引き続き考えようかと思います。