プログラムのパフォーマンス解析

funcs

funcs は以下の構文を持っています。

funcs[-adehou] 

 

 

func ...

funcs[-adehilou] 

[directly] 

 

 

funcs[-adehlou] 

[directly] 

called by 

func ...

funcs[-adehlou] 

[directly] 

calling 

func ...

funcs[-adehlou] 

[directly] 

reading 

var ....

funcs[-adehlou] 

[directly] 

writing 

var ...

funcs[-adehlou] 

[directly] 

accessing 

var ...

funcs[-adehlou] 

[directly] 

affecting 

lock ...

funcs[-adehlou] 

[directly] 

inverting 

lock ...

funcs は、読み込まれたファイル中で定義され、呼び出される関数についての情報をリストします。各関数について 1 行分の情報が表示されます。

表 A-7 funcs のオプション

オプション

定義 

 

-a 

(asserts) assert サブコマンドの設定内容に従って、各関数のエントリに対してどのロックが保持されることになっているかに関する情報を提示します。アサーションは以下のように表示されます。

asserts={ lock ... }

read_asserts={ lock ... }

エントリに対して整合性が保持されていないロック名の前には、アスタリクが付けられます (解析後)。 

-e

(effects) 各関数がロックに持つ副作用についての情報を提示します (たとえば、"acquires mutex lock foo" など)。副作用は以下のように表示されます。

side_effects={ effect [, effect] ... }

解析に先だってこのオプションを使用すると、 assert side effect サブコマンドによってアサートされた副作用も提示されます。解析後には、解析中に発見された副作用についての情報も提示されます。 

-d

(defined) 読み込まれたファイル中で定義されている関数のみを提示します。未定義の関数の表示は抑制されます。

-h

(held) (解析後) 関数が呼び出された際に、どのロックが整合性を保持されていたかについての情報を提示します。エントリの読み取り (または書き込み) に対してロックが整合性を保持されている場合、以下のように表示されます。

held={ lock ... }+{ lock ... }

read_held={ lock ... }+{ lock ... }

各セットの最初の行は、関数呼び出し時に整合性を保持されるロックのリストで、2 行目は整合性を保持されるないロック (関数が呼び出し時、保持されていることはあっても、つねに保持されるわけではないロック) のリストです。 

-i

(ignored) 無視される関数をリストします。

-l

(long) -aeoh に相当します。

-o

(other) 各関数に関する以下の情報を提示します (該当する場合)。

=ignored

ロック lint は、ignore サブコマンドを使って関数を無視するよう指示されています。 

=nonreturning

この関数を介した呼び出しは戻ってきません (ターゲットとなる関数のいずれも戻りません)。 

=rooted

declare root サブコマンドによって、関数がルート化されています。 

=root

関数がもともとルートです (ほかの関数から呼び出されることがありません)。 

=recursive

関数が自分自身を呼び出します。 

=unanalyzed

解析中に、関数が呼び出されませんでした (そのため、解析が行われませんでした)。foobar を呼び出し、barfoo を呼び出し、foo または bar を呼び出す関数はほかになく、いずれもルート化されていない (「=rooted」を参照) 場合で、=root とは異なります。つまり、foo および bar はルートではなく、ほかのいかなるルート関数からもたどり着くことができないため、これらの関数は解析されることはありません。

calls=#

読み込まれたファイルの内容そのままに、ソースコード中、この関数が呼び出されている箇所の数を示します。実際には解析されない呼び出しもあります。たとえば、disallow サブコマンドによって、実際には呼び出しが行われないこともあります。

-u

(undefined) 読み込まれたファイル中に定義されていない関数のみを提示します。

funcs [-adehou] func ...

個々の関数に関する情報をリストします。デフォルトでは、この形式のサブコマンドは、-aeho が指定されている場合と同様に、関数についての詳細情報をすべて提供します。

funcs [-adehilou]

無視されないすべての関数についての情報をリストします。-i が使用されると、無視される関数もリストされます。

funcs [-adehlou] [directly] called by func ...

指定された関数の呼び出しの結果として呼び出される可能性のある関数のみをリストします。directly が指定されると、指定された関数によって呼び出される関数のみがリストされます。directly が指定されない場合は、呼び出された関数がさらに呼び出している関数もリストされます。

funcs [-adehlou] [directly] calling func ...

自身が呼び出されると、その結果として、指定された 1 つまたは複数の関数を呼び出す可能性のある関数のみをリストします。この後の「directly について」の項も参照してください。

funcs [-adehlou] [directly] reading var ...

自身が呼び出されると、その結果として、指定された 1 つまたは複数の関数が読み込まれる可能性のある関数のみをリストします。この後の「directly について」の項も参照してください。

funcs [-adehlou] [directly] writing var ...

自身が呼び出されると、その結果として、指定された 1 つまたは複数の変数が書き込まれる可能性のある関数のみをリストします。この後の「directly について」の項も参照してください。

funcs [-adehlou] [directly] accessing var ...

自身が呼び出されると、その結果として、指定された 1 つまたは複数の変数がアクセスされる (読み取られるまたは書き込まれる) 可能性のある関数のみをリストします。この後の「directly について」の項も参照してください。

funcs [-adehlou] [directly] affecting lock ...

自身が呼び出されると、その結果として、指定された 1 つまたは複数のロックに影響 (獲得、解放、昇格、または降格) を与える可能性のある関数のみをリストします。この後の「directly について」の項も参照してください。

funcs [-adehlou] [directly] inverting lock ...

指定された 1 つまたは複数のロックを反転させる関数のみをリストします (「ロックの逆転」を参照)。directly が指定されると、自身が 1 つまたは複数のロックを反転させている (実際には解放する) 関数のみがリストされます。directly が指定されない場合は、すでに保持されたロックとともに呼び出され、その後、そのロックを反転させるほかの関数を呼び出す関数もリストされます。

たとえば、以下のコードでは、f3() はロック m を直接反転し、f2() はそれを間接的に反転しています。


f1() { pthread_mutex_unlock(&m); f2(); pthread_mutex_lock(&m); }
f2() { f3(); }
f3() { pthread_mutex_unlock(&m); pthread_mutex_lock(&m); } 

directly について

特にことわり書きがない限り、キーワード directly を許可する形式は、それ自身が記述に一致する関数のみをリストします。directly が指定されない場合は、指定された関数を呼び出すすべての関数が表示され、さらにそれらの関数を呼び出す関数もリストされます。