THIS IS AN OLD PAGE. GO TO kcachegrind.github.io FOR THE CURRENT VERSION. This is the homepage of the profiling tool Callgrind and the profile data visualization KCachegrind. Both are licensed under GPL V2. Callgrind uses runtime instrumentation via the Valgrind framework for its cache simulation and call-graph generation. This way, even shared libraries and dynamically opened plugins can be profi
UNIX 偏向文書 artu の中で "Measure Before Optimizing" と説く Raymond は, 同時にプロファイラの計測機構 (instrumentation) がもたらすノイズについて注意を促している. 私のプロファイラ信仰に不安が翳を落とす. gprof ノイズはさておき, そもそもプロファイラはどんな仕組みで速度を測っているんだろう. gprof のマニュアル によると, GNU 一族のプロファイラは次のように実装されている: まず "-pg" オプションつきの gcc でソースをコンパイルする. この指示を受けたコンパイラは各関数の冒頭に "mcount" という名前の関数呼出しを加える. リンクする C のランタイムも専用バージョン (gcrt0.o) に差し替わる. このランタイムは裏で profil() 関数を使いタイマを仕掛ける. そのタイマは発
でかいソフトウェアの、大量のソースコードを短時間で読む必要が生じたので、その補助ツールとしてptrace(2)ベースのLinux用関数トレーサを自作しました。こういうツール上でまずソフトウェアを実行してみて、どのファイルのどの関数がどういう順で呼ばれるか把握おけば、いきなりソースコードの山と格闘を始めるより楽かなーと思いまして。せっかく作ったので公開します。 http://binary.nahi.to/hogetrace/ straceはシステムコールだけ、ltraceは共有ライブラリ(DSO)の関数呼び出しだけ*1をトレースしますが、このツールは、実行バイナリ中の自作関数の呼び出しもトレースします。例えば再帰で1から10まで足し算するソースコードを用意して % cat recursion.c #include <stdio.h> int sum(int n) { return n ==
この本の「#77 関数へのenter/exitをフックする」で、GCCのコンパイルオプション-finstrument-functionsを使い、関数が呼び出された時、関数から復帰するときにフックを入れる方法が紹介されています。フック関数のシグニチャは以下です。 void __cyg_profile_func_enter(void* func_addr, void* call_site); void __cyg_profile_func_exit(void* func_addr, void* call_site); このフック処理に渡されるアドレスから関数名を出して、関数の実行を追う簡易な関数トレーサを作成します。アドレスから関数に変換する方法で一番簡単そうなのは、同じ本の「#62 dlopenで実行時に動的リンクする」でglibcのGNU拡張として紹介されているdladdr関数です。 #i
実際に gcc-4.1.0 で -fprofile-generate -fprofile-use を使ってみた.使用したコードは,手元にあった自作のもの.26028ステップもあります(涙 両オプションは コンパイル時とリンク時 両方で指定する必要がある. $ export CPPFLAGS="-fprofile-genereate" $ export LDFLAGS="-fprofile-genereate" $ make clean $ make バイナリを数回動かして,データをサンプルする. $ export CPPFLAGS="-fprofile-use" $ export LDFLAGS="-fprofile-use" $ make clean $ make 2回目のbuildでは,以下のようなワーニングが出たりするが, thread_core.cpp: In function '
Copyright © 2000-2004 Victoria University of Manchester, John Levon and others
setitimer システムコールを使って簡単なプロファイラを作る setitimer システムコールを使うと一定時間間隔でシグナルを発生させることができます。頻繁にシグナルを発生させて、「シグナルが呼ばれたときにどこにいたか」を記録していけばサンプリング方式のプロファイラを作ることができます。 以下のコードは x86 の Linux を対象とした簡単なプロファイラです。prof_start() では setitimer() を使ってプロファイルをとるための下準備をしています。シグナルハンドラ prof_handler() ではシグナルが呼ばれた時点のコンテキストの情報からプログラムカウンタを取り出し、fwrite() でファイルに書きこんでいます。 LD_PRELOAD するだけで使えるよう、 prof_start() と prof_end() にそれぞれ constructor と d
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く