名前 | 形式 | 機能説明 | オプション | 使用例 | ファイル | 制限事項 | 属性 | 関連項目
apptrace [-f] [-F [!] tracefromlist] [-T [!] tracetolist] [-o outputfile] [ [-tv] [!] call ,...] command [command arguments]
apptrace ユーティリティは、command により指定された実行可能プログラムを実行して、プログラムの command が Solaris 共有ライブラリに対して行うすべての関数呼び出しを追跡します。追跡可能な関数呼び出しごとに、呼び出されたライブラリインタフェースの名前、渡された引数の値、および戻り値が apptrace により報告されます。
デフォルトでは、apptrace は、実行可能オブジェクトからそれが依存するすべての共有オブジェクトに対する直接呼出しを追跡します。間接呼び出し (つまり、実行可能プログラムが依存する共有オブジェクト間で行われた呼び出し) は、デフォルトでは報告されません。
追加共有オブジェクトとの間で実行される呼び出しは、-F または -T オプションを指定することにより追跡できます (下記参照)。
デフォルトのレポート形式は、呼び出しごとに 1 行であり、参照によって渡された引数またはデータ構造体のフォーマット出力はありません。
追加引数の詳細を示すフォーマット出力は、-v オプションを使用すると得られます (下記参照)。
デフォルトでは、共有オブジェクトによって提供されるインタフェースは、呼び出された場合、すべて追跡されます。ただし、-t または -v オプションのいずれか、あるいは両方を使用することにより、追跡するインタフェース群を制限できます。
通常、実行時にリンクされる動的オブジェクト (実行可能オブジェクトと依存対象のすべての共有オブジェクト) 間の呼び出しを追跡することができるため、追跡された各呼び出しのレポートには、呼び出し元のオブジェクトの名前が示されます。
apptrace は、プロシージャリンケージテーブルを介して動的オブジェクト間で発生するすべてのプロシージャ呼び出しを追跡します。そのため、そのテーブルを介して結合されているプロシージャ呼び出しだけが追跡されます。『リンカーとライブラリ』を参照してください。
次のオプションを指定できます。
fork(2) によって作成されたすべての子プロセスを追跡します。また、各行の先頭にプロセス ID を表示します。
コンマで区切られた共有オブジェクトのリストからの呼び出しを追跡します。これらの共有オブジェクトからの呼び出しだけが追跡されます。デフォルトでは、メインの実行可能オブジェクトからの呼び出しだけが追跡されます。共有オブジェクトのベース名だけが必要になります。たとえば、libc は /usr/lib/libc.so.1 に一致します。また、fnmatch(5) で説明されているように、シェルのワイルドカード文字がサポートされています。! が前に付いたリストは、そこからの呼び出しが追跡から除外されるオブジェクト群を定義します。command からの呼び出しの追跡が必要な場合、command は tracefromlist のメンバーでなければなりません。
apptrace の出力を outputfile に送ります。デフォルトでは、apptrace の出力は、追跡されるプロセスの stderr ストリームに送られます。
関数呼び出しを追跡、または除外します。コンマで区切られたリスト call に指定された呼び出しが追跡されます。このリストが ! で始まる場合、指定された関数呼び出しが追跡出力から除外されます。デフォルト値は -t * です。シェルスタイルのワイルドカードを使用できます。
コンマで区切られた共有オブジェクトのリストへの呼び出しを追跡します。デフォルトでは、すべての共有オブジェクトへの呼び出しが追跡されます。上記と同様、ベース名だけが必要であり、ワイルドカードを使用できます。! が前に付いたリストは、そこへの呼び出しが追跡から除外されるオブジェクト群を示します。
指定された関数呼び出しの引数と戻り値を示す冗長な、フォーマット出力を提供します (前述の -t オプションと同様)。truss(1) と違って、-v オプションで指定した呼び出しは、-t オプションで指定する必要はありません。たとえば、apptrace -v open は、truss -t open -v open と同じです。
% apptrace date -> date -> libc.so.1:atexit(0xff3bf9ac, 0x22000, 0x0) ** NR -> date -> libc.so.1:atexit(0x11550, 0xfefeef80, 0xab268) ** NR -> date -> libc.so.1:setlocale(0x6, 0x11560, 0x0) ** NR -> date -> libc.so.1:textdomain(0x11564, 0xfefce156, 0xff160200) ** NR -> date -> libc.so.1:int getopt(int = 0x1, const char * * = 0xffbffa5c, const char * = 0x11574 "a:u") <- date -> libc.so.1:getopt() = 0xffffffff -> date -> libc.so.1:time_t time(time_t * = 0x225c0) <- date -> libc.so.1:time() = 0x41ab6e82 -> date -> libc.so.1:char * nl_langinfo(nl_item = 0x3a) <- date -> libc.so.1:nl_langinfo() = 0xfefd3e10 -> date -> libc.so.1:struct tm * localtime(const time_t * = 0x225c0) <- date -> libc.so.1:localtime() = 0xff160240 -> date -> libc_psr.so.1:memcpy(0xffbff9cc, 0xff160240, 0x24) ** NR -> date -> libc.so.1:size_t strftime(char * = 0x225c4 "", size_t = 0x400, const char * = 0xfefd3e10 "%a %b %e %T %Z %Y", const struct tm * = 0xffbff9cc) <- date -> libc.so.1:strftime() = 0x1c -> date -> libc.so.1:int puts(const char * = 0x225c4 "Mon Nov 29 10:46:26 PST 2004") Mon Nov 29 10:46:26 PST 2004 <- date -> libc.so.1:puts() = 0x1d -> date -> libc.so.1:exit(0x0, 0x22400, 0x0) ** NR |
% apptrace -v localtime,strftime,puts date -> date -> libc.so.1:struct tm * localtime(const time_t * = 0x225c0) arg0 = (const time_t *) 0x225c0 return = (struct tm *) 0xff160280 (struct tm) { tm_sec: (int) 0x4 tm_min: (int) 0x34 tm_hour: (int) 0xa tm_mday: (int) 0x1d tm_mon: (int) 0xa tm_year: (int) 0x68 tm_wday: (int) 0x1 tm_yday: (int) 0x14d tm_isdst: (int) 0 } <- date -> libc.so.1:localtime() = 0xff160280 -> date -> libc.so.1:size_t strftime(char * = 0x225c4 "", size_t = 0x400, const char * = 0xfefd3e10 "%a %b %e %T %Z %Y", const struct tm * = 0xffbff99c) arg0 = (char *) 0x225c4 "" arg1 = (size_t) 0x400 arg2 = (const char *) 0xfefd3e10 "%a %b %e %T %Z %Y" arg3 = (const struct tm *) 0xffbff99c (struct tm) { tm_sec: (int) 0x4 tm_min: (int) 0x34 tm_hour: (int) 0xa tm_mday: (int) 0x1d tm_mon: (int) 0xa tm_year: (int) 0x68 tm_wday: (int) 0x1 tm_yday: (int) 0x14d tm_isdst: (int) 0 } return = (size_t) 0x1c <- date -> libc.so.1:strftime() = 0x1c -> date -> libc.so.1:int puts(const char * = 0x225c4 "Mon Nov 29 10:52:04 PST 2004") arg0 = (const char *) 0x225c4 "Mon Nov 29 10:52:04 PST 2004" Mon Nov 29 10:52:04 PST 2004 return = (int) 0x1d <- date -> libc.so.1:puts() = 0x1d |
** NR - 関数呼び出しの戻り値は追跡できません。
apptrace の基本実行時サポートは Solaris 実行時リンカー (ld.so.1(1)) のリンク監査機能によって提供され、apptrace コマンドは、/usr/lib/abi に格納されている監査オブジェクト (apptrace.so.1) に依存してこの機能を使用します。
一般に、apptrace は、変数引数リストを受け付ける関数への呼び出しを追跡することはできません。一部の特別な場合、特に printf および scanf ファミリでは、この制限事項に対処するために、適切なコーディング方法がいくつか用いられています.
apptrace ユーティリティは、戻り値のタイプが struct または union である関数呼び出しの戻り値を追跡することができません。
スタックを調べようとする関数、または呼び出し元に関する情報を抽出しようとする関数は追跡できません。たとえば、 [gs]etcontext()、 [sig]longjmp()、[sig]setjmp()、 vfork() がこれに相当します。
exit(2) などの値を返さない関数では、戻り値については追跡されません。
セキュリティ上の理由から、適切な特権を持つプロセスだけが apptrace を使用して setuid/setgid プログラムを追跡できます。
varargs.h の取り込みを必要とする関数 (vwprintw(3XCURSES) や vwscanw(3XCURSES) など) を追跡するときは、引数の出力は書式化されません。
次の属性については、attributes(5)のマニュアルページを参照してください。
属性タイプ |
属性値 |
---|---|
使用条件 |
SUNWcstl (32 ビット) |
SUNWcstlx (64 ビット) |
|
インタフェースの安定性 |
不安定 |