Home

sprof(1) - ja

SPROF(1)Linux User ManualSPROF(1)

名前

sprof 共有オブジェクトのプロファイルデータを読み出して表示する

書式

sprof [option]... shared-object-path [profile-data-path]

説明

sprof コマンドは、 最初のコマンドライン引数で指定された共有オブジェクト (共有ライブラリ) のプロファイルの概要を表示する。 2 番目のコマンドライン引数 (省略可能) で指定された生成済みのプロファイルデータを使って、 プロファイルの概要が生成される。 プロファイルデータのパス名が省略された場合、 sprof は、 共有オブジェクトの soname を使ってパス名を元に、 カレントディレクトリに <soname>.profile という名前のファイルを探して、 プロファイルデータを特定しようとする。

オプション

以下のコマンドラインオプションは生成されるプロファイリング出力を指定する。

共有オブジェクトで公開されているインターフェースに対して呼び出し経路のペアのリストを表示する。 各経路が使用された回数も表示される。
監視対象のオブジェクトの全関数の、 回数と tick が入った flat profile を生成する。
コールグラフを生成する。

上記のオプションがどれも指定されなかった場合のデフォルトの動作は、 flat profile とコールグラフが表示される。

以下のコマンドラインオプションも使用できる。

-?, --help
コマンドラインオプションと引数の概要を表示し終了する。
使用方法の簡潔な概要を表示し終了する。
プログラムのバージョンを表示し終了する。

準拠

sprof コマンドは GNU 拡張であり、 POSIX.1 には存在しない。

以下は sprof の使用例を示したものである。 この例では、メインプログラムで共有オブジェクト内の 2 つの関数を呼び出している。 最初に、 メインプログラムのコードは以下の通りである。


$ cat prog.c#include <stdlib.h>void x1(void);void x2(void);intmain(int argc, char *argv[]){
x1();
x2();
exit(EXIT_SUCCESS);}

関数 x1() と x2() は以下のソースファイルで定義されており、 このファイルから共有オブジェクトが構成される。


$ cat libdemo.c#include <unistd.h>voidconsumeCpu1(int lim){
for (int j = 0; j < lim; j++) getppid();}voidx1(void) {
for (int j = 0; j < 100; j++) consumeCpu1(200000);}voidconsumeCpu2(int lim){
for (int j = 0; j < lim; j++) getppid();}voidx2(void){
for (int j = 0; j < 1000; j++) consumeCpu2(10000);}

ここで、 実際の名前は libdemo.so.1.0.1 で soname は libdemo.so.1 で共有オブジェクトを構成する。


$ cc -g -fPIC -shared -Wl,-soname,libdemo.so.1 \
-o libdemo.so.1.0.1 libdemo.c

次に、 ライブラリ soname とライブラリのリンカー名へのシンボリックリンクを作成する。


$ ln -sf libdemo.so.1.0.1 libdemo.so.1$ ln -sf libdemo.so.1 libdemo.so

続けて、 共有オブジェクトとリンクしてメインプログラムをコンパイルし、 プログラムの動的な依存の一覧を表示する。


$ cc -g -o prog prog.c -L. -ldemo$ ldd prog	linux-vdso.so.1 =>  (0x00007fff86d66000)	libdemo.so.1 => not found	libc.so.6 => /lib64/libc.so.6 (0x00007fd4dc138000)	/lib64/ld-linux-x86-64.so.2 (0x00007fd4dc51f000)

共有オブジェクトのプロファイル情報を取得するために、 環境変数 LD_PROFILE にこのライブラリの soname を設定する。


$ export LD_PROFILE=libdemo.so.1

環境変数 LD_PROFILE_OUTPUT にプロファイル情報を出力するディレクトリのパス名を設定し、 このディレクトリが存在しない場合は作成する。


$ export LD_PROFILE_OUTPUT=$(pwd)/prof_data$ mkdir -p $LD_PROFILE_OUTPUT

LD_PROFILE を設定すると、 プロファイルの出力は出力ファイルがすでに存在する場合は「追記」されるので、 既存のプロファイルデータが存在しないようにしておく。


$ rm -f $LD_PROFILE_OUTPUT/$LD_PROFILE.profile

次にプログラムを実行し、 プロファイリング出力を生成させる。 プロファイリング出力は LD_PROFILE_OUTPUT で指定されたディレクトリにファイルが書き込まれる。


$ LD_LIBRARY_PATH=. ./prog$ ls prof_datalibdemo.so.1.profile

sprof -p オプションを使って、 呼び出し回数と tick 数が含まれる flat プロファイルを生成する。


$ sprof -p libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profileFlat profile:Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
60.00 0.06 0.06 100 600.00 consumeCpu1
40.00 0.10 0.04 1000 40.00 consumeCpu2
0.00 0.10 0.00 1 0.00 x1
0.00 0.10 0.00 1 0.00 x2

sprof -q オプションを使うと、 コールグラフが生成される。


$ sprof -q libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profileindex % time    self  children    called     name
0.00 0.00 100/100 x1 [1][0] 100.0 0.00 0.00 100 consumeCpu1 [0]----------------------------------------------
0.00 0.00 1/1 <UNKNOWN>[1] 0.0 0.00 0.00 1 x1 [1]
0.00 0.00 100/100 consumeCpu1 [0]----------------------------------------------
0.00 0.00 1000/1000 x2 [3][2] 0.0 0.00 0.00 1000 consumeCpu2 [2]----------------------------------------------
0.00 0.00 1/1 <UNKNOWN>[3] 0.0 0.00 0.00 1 x2 [3]
0.00 0.00 1000/1000 consumeCpu2 [2]----------------------------------------------

上記や以下の例で、 "<UNKNOWN>" の文字列は、 識別子がプロファイルされたオブジェクトの外部にあることを表している (この例では "<UNKNOWN>" になっているのは main() 内のオブジェクトである)。

sprof -c オプションを使うと、 呼び出しの組とその発生回数のリストが生成される。


$ sprof -c libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile<UNKNOWN>                  x1                                 1x1                         consumeCpu1                      100<UNKNOWN>                  x2                                 1x2                         consumeCpu2                     1000

関連項目

gprof(1), ldd(1), ld.so(8)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

2020-11-01Linux