Solaris 動的トレースガイド

サブルーチン

サブルーチンは、通常、DTrace の内部状態にのみ影響を及ぼすという点で、アクションとは異なっています。このため、「破壊サブルーチン」というようなものは存在しません。また、サブルーチンがデータをバッファー内でトレースすることもありません。サブルーチンには、セクション 9F と 3C のインタフェースに類似したものが多数含まれています。対応するサブルーチンの詳細については、Intro(9F)Intro(3) のマニュアルページを参照してください。

alloca()

void *alloca(size_t size)

alloca() は、スクラッチ空間から size バイトを割り当て、割り当てられたメモリーへのポインタを返します。必ず 8 バイトのバイト列を持つポインタが返されます。スクラッチ空間は、節の開始から完了までの間しか有効ではありません。alloca() で割り当てられたメモリーは、節の完了時に割り当て解除されます。使用できるスクラッチ空間が不足している場合、メモリーの割り当ては行われず、エラーが生成されます。

basename()

string basename(char *str)

basename() は、basename(1) に相当します。このサブルーチンは、指定された文字列のコピーから成る文字列を生成します。ただし、/ で終わる接頭辞は付きません。返される文字列には、スクラッチメモリーからメモリーが割り当てられます。したがって、節が完了すると、この文字列は無効になります。使用できるスクラッチ空間が不足している場合、basename は実行されず、エラーが生成されます。

bcopy()

void bcopy(void *src, void *dest, size_t size)

bcopy() は、src がポイントするメモリーから dest がポイントするメモリーへ、size バイトをコピーします。すべてのコピー元のメモリーはスクラッチメモリーの外部、すべてのコピー先のメモリーはスクラッチメモリーの内部に存在していなければなりません。この条件が満たされない場合、コピーは行われず、エラーが生成されます。

cleanpath()

string cleanpath(char *str)

cleanpath() は、str で指定されたパスのコピーから成る文字列を生成します。ただし、特定の重複要素は排除されます。特に、パス内の「/./」要素は削除され、「/../」要素は縮められます。パス内の「/../」は、シンボリックリンクを考慮せずに縮められます。このため、cleanpath() を使用すると、有効なパスが縮められ、短い無効なパスが返されることがあります。

たとえば、str が「/foo/../bar」で、/foo/net/foo/export のシンボリックリンクになっている場合、bar があるのは / ではなく /net/foo であるのに、cleanpath() は文字列「/bar」を返します。この問題が発生するのは、cleanpath() が起動プローブのコンテキストで呼び出されるからです。起動プローブのコンテキストでは、完全なシンボリックリンク解決は行われず、任意の名前は使用できません。返される文字列には、スクラッチメモリーからメモリーが割り当てられます。したがって、節が完了すると、この文字列は無効になります。使用できるスクラッチ空間が不足している場合、cleanpath は実行されず、エラーが生成されます。

copyin()

void *copyin(uintptr_t addr, size_t size)

copyin() は、指定されたユーザーアドレス addr から DTrace スクラッチバッファーに、指定されたサイズ size バイトをコピーし、このバッファーのアドレスを返します。ユーザーアドレスは、現在のスレッドに関連付けられたプロセスの空間に含まれるアドレスであると見なされます。最終的なバッファーポインタは、必ず 8 バイトのバイト列を持つことになります。指定されたアドレスは、現在のプロセス内のフォルトインページに対応している必要があります。アドレスがフォルトインページに対応していない場合や、使用できるスクラッチ空間が不足している場合は、NULL が返され、エラーが生成されます。copyin のエラーが発生する可能性を減らすテクニックについては、第 33 章ユーザープロセスのトレースを参照してください。

copyinstr()

string copyinstr(uintptr_t addr)

copyinstr() は、指定されたユーザーアドレス addr から DTrace スクラッチバッファーに、NULL で終了する C 文字列をコピーし、このバッファーのアドレスを返します。ユーザーアドレスは、現在のスレッドに関連付けられたプロセスの空間に含まれるアドレスであると見なされます。文字列長は、strsize オプションで設定された値以下に制限されます。詳細については、第 16 章オプションとチューニング可能パラメータを参照してください。copyin の場合と同じく、指定されたアドレスは、現在のプロセス内のフォルトインページに対応している必要があります。アドレスがフォルトインページに対応していない場合や、使用できるスクラッチ空間が不足している場合は、NULL が返され、エラーが生成されます。第 33 章ユーザープロセスのトレース エラーが発生する可能性を減らすテクニックについては、Chapter 33, User Process Tracingを参照してください。

copyinto()

void copyinto(uintptr_t addr, size_t size, void *dest)

copyinto() は、指定されたユーザーアドレス addr から、dest で指定された DTrace スクラッチバッファーに、指定されたサイズ size バイトをコピーします。ユーザーアドレスは、現在のスレッドに関連付けられたプロセスの空間に含まれるアドレスであると見なされます。指定されたアドレスは、現在のプロセス内のフォルトインページに対応している必要があります。アドレスがフォルトインページに対応していない場合や、コピー先のメモリーの一部がスクラッチ空間内にない場合、コピーは行われず、エラーが生成されます。第 33 章ユーザープロセスのトレース エラーが発生する可能性を減らすテクニックについては、Chapter 33, User Process Tracingを参照してください。

dirname()

string dirname(char *str)

dirname() は、dirname(1) に相当します。このサブルーチンは、str で指定されたパス名の最後のレベルを除くすべてのレベルから成る文字列を生成します。返される文字列には、スクラッチメモリーからメモリーが割り当てられます。したがって、節が完了すると、この文字列は無効になります。使用できるスクラッチ空間が不足している場合、dirname は実行されず、エラーが生成されます。

msgdsize()

size_t msgdsize(mblk_t *mp)

msgdsize() は、mp がポイントしているデータメッセージ内のバイト数を返します。詳細については、msgdsize(9F) のマニュアルページを参照してください。msgdsize() がカウントするのは、M_DATA 型のデータブロックだけです。

msgsize()

size_t msgsize(mblk_t *mp)

msgsize() は、mp がポイントしているメッセージ内のバイト数を返します。msgdsize() がデータのバイト数だけを返すのに対し、msgsize() はメッセージ内の全バイト数を返します。

mutex_owned()

int mutex_owned(kmutex_t *mutex)

mutex_owned() は、mutex_owned(9F) の実装です。mutex_owned() は、呼び出しスレッドが指定されたカーネル相互排他ロックを所有している場合は、ゼロ以外の値を返します。指定された適応型相互排他ロックの所有者が存在しない場合は、ゼロを返します。

mutex_owner()

kthread_t *mutex_owner(kmutex_t *mutex)

mutex_owner() は、指定された適応型カーネル相互排他ロックの現在の所有者のスレッドポインタを返します。指定された適応型相互排他ロックの所有者が存在しない場合や、指定された相互排他ロックがスピン相互排他ロックである場合、mutex_owner()NULL を返します。mutex_owned(9F) のマニュアルページを参照してください。

mutex_type_adaptive()

int mutex_type_adaptive(kmutex_t *mutex)

mutex_type_adaptive() は、指定されたカーネル相互排他ロックが MUTEX_ADAPTIVE 型 (適応型) の場合はゼロ以外、MUTEX_ADAPTIVE 型でない場合はゼロを返します。次のいずれかの条件が満たされている場合、相互排他ロックは適応型になります。

相互排他ロックの詳細については、mutex_init(9F) のマニュアルページを参照してください。Solaris カーネル内のほとんどの 相互排他ロックは適応型です。

progenyof()

int progenyof(pid_t pid)

progenyof() は、呼び出しプロセス (一致したプローブを引き起こしているスレッドに関連付けられたプロセス) が指定されたプロセス ID pid の子孫にあたる場合、ゼロ以外の値を返します。

rand()

int rand(void)

rand() は、擬似乱数整数を返します。返される値は、弱い擬似乱数であり、暗号化アプリケーションでは使用できません。

rw_iswriter()

int rw_iswriter(krwlock_t *rwlock)

rw_iswriter() は、指定された読み取り/書き込みロック rwlock が書き込み側に保持されている場合、または書き込み側から要求されている場合、ゼロ以外の値を返します。ロックが読み取り側だけで保持されていて、書き込み側がブロックされていない場合、またはロックがまったく保持されていない場合、rw_iswriter() はゼロを返します。rw_init(9F) のマニュアルページを参照してください。

rw_write_held()

int rw_write_held(krwlock_t *rwlock)

w_write_held() は、指定された読み取り/書き込みロック rwlock が書き込み側によって保持されている場合、ゼロ以外の値を返します。ロックが読み取り側だけで保持されている場合やまったく保持されていない場合、rw_write_held () はゼロを返します。rw_init(9F) のマニュアルページを参照してください。

speculation()

int speculation(void)

speculation() は、speculate() で使用する投機トレースバッファーを予約し、このバッファーの識別子を返します。詳細については、第 13 章投機トレースを参照してください。

strjoin()

string strjoin(char *str1, char *str2)

strjoin() は、str1str2 の連結から成る文字列を生成します。返される文字列には、スクラッチメモリーからメモリーが割り当てられます。したがって、節が完了すると、この文字列は無効になります。使用できるスクラッチ空間が不足している場合、strjoin は実行されず、エラーが生成されます。

strlen()

size_t strlen(string str)

strlen() は、指定された文字列 str の長さ (バイト単位) を返します。このとき、終端の NULL バイトは除外されます。