名前 | 形式 | 機能説明 | オプション | 使用例 | ファイル | 制限事項 | 属性 | 関連項目
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(func = 0xff3ba1c8) = 0x0 date -> libc.so.1:atexit(func = 0x117e4) = 0x0 date -> libc.so.1:setlocale(category = 0x6, locale = "") = "C" date -> libc.so.1:textdomain(domainname = "SUNW_OST_OSCMD") = "SUNW_OST_OSCMD" date -> libc.so.1:getopt(argc = 0x1, argv = 0xffbeed5c, optstring = "a:u") = 0xffffffff errno = No error date -> libc.so.1:time(tloc = 0x21ecc) = 0x371397c3 date -> libc.so.1:nl_langinfo(item = 0x3a) = "%a %b %e %T %Z %Y" date -> libc.so.1:localtime(clock = 0x21ecc) = 0xff03c928 date -> libc_psr.so.1:memcpy(0xffbeeccc, 0xff03c928, 0x24) date -> libc.so.1:strftime(s = "Tue Apr 13 15:15:15 ", maxsize = 0x400, format = "%a %b %e %T %Z %Y", timeptr = 0xffbeeccc) = 0x1c date -> libc.so.1:puts(Tue Apr 13 15:15:15 EDT 1999 s = "Tue Apr 13 15:15:15 ") = 0x1d date -> libc.so.1:exit(status = 0) |
% apptrace -v '*gid*' id -a id -> libc.so.1:getgid() = 0xa return = (gid_t) 10 (0xa) id -> libc.so.1:getegid() = 0xa return = (gid_t) 10 (0xa) id -> libc.so.1:getgrgid(gid = 0xa) = 0x2238c gid = (gid_t) 10 (0xa) return = (struct group *) 0x2238c (struct group) { gr_name: (char *) 0x223a0 "staff" gr_passwd: (char *) 0x223a6 "" gr_gid: (gid_t) 10 (0xa) gr_mem: (char **) 0x2239c } id -> libc.so.1:getgrgid(gid = 0xa) = 0x2238c gid = (gid_t) 10 (0xa) return = (struct group *) 0x2238c (struct group) { gr_name: (char *) 0x223a0 "staff" gr_passwd: (char *) 0x223a6 "" gr_gid: (gid_t) 10 (0xa) gr_mem: (char **) 0x2239c } id -> libc.so.1:getgrgid(gid = 0x3) = 0x2238c gid = (gid_t) 3 (0x3) return = (struct group *) 0x2238c (struct group) { gr_name: (char *) 0x223b4 "sys" gr_passwd: (char *) 0x223b8 "" gr_gid: (gid_t) 3 (0x3) gr_mem: (char **) 0x2239c } id -> libc.so.1:getgrgid(gid = 0x29) = 0x2238c gid = (gid_t) 41 (0x29) return = (struct group *) 0x2238c (struct group) { gr_name: (char *) 0x223a4 "opcom" gr_passwd: (char *) 0x223aa "" gr_gid: (gid_t) 41 (0x29) gr_mem: (char **) 0x2239c } id -> libc.so.1:getgrgid(gid = 0xe) = 0x2238c gid = (gid_t) 14 (0xe) return = (struct group *) 0x2238c (struct group) { gr_name: (char *) 0x223a0 "sysadmin" gr_passwd: (char *) 0x223a9 "" gr_gid: (gid_t) 14 (0xe) gr_mem: (char **) 0x2239c } id -> libc.so.1:getgrgid(gid = 0xd3) = 0x2238c gid = (gid_t) 211 (0xd3) return = (struct group *) 0x2238c (struct group) { gr_name: (char *) 0x223a8 "test" gr_passwd: (char *) 0x223ad "" gr_gid: (gid_t) 211 (0xd3) gr_mem: (char **) 0x2239c } uid=44013(georgn) gid=10(staff) groups=10(staff),3(sys), 41(opcom),14(sysadmin),211(test) |
apptrace の基本実行時サポートは Solaris 実行時リンカー (ld.so.1(1)) のリンク監査機能によって提供され、apptrace コマンドは、/usr/lib/abi に格納されている監査オブジェクト (apptrace.so.1) に依存してこの機能を使用します。
呼び出しを追跡するときに (-v オプションによって選択された) 引数のフォーマット出力を実行するには、呼び出されたインタフェースに指定された引数の数とデータ型がapptrace でわかっていなければなりません。apptrace がフォーマット出力を実行するために利用する、特殊な実行時サポート共有オブジェクトが用意されています。実行時サポートオブジェクトが Solaris の共有ライブラリごとに提供されており、各共有ライブラリにはその共有ライブラリ内の各インタフェースに対する「インターセプタ (interceptor)」関数が組み込まれています。これらのサポート共有オブジェクトは、/usr/lib/abi に格納されています。apptrace は、ライブラリインタフェースの名前を、ライブラリのサポート冗長追跡共有オブジェクトのインターセプタ関数の名前にマップする単純なアルゴリズムを備えています。ライブラリのサポート追跡共有オブジェクトにインターセプタ関数がない場合、apptrace は、そのインタフェースの引数の数、またはデータ型のどちらかを判別できません。この場合、apptrace は、呼び出し追跡レポートのデフォルト出力 (最初の 3 つの引数を示す 16 進形式の出力) を使用します。
一般に、apptrace は、変数引数リストを受け付ける関数への呼び出しを追跡することはできません。一部の特別な場合、特に printf および scanf ファミリでは、この制限事項に対処するために、適切なコーディング方法がいくつか用いられています.
スタックを調べようとする関数、または呼び出し元に関する情報を抽出しようとする関数は追跡できません。たとえば、 [gs]etcontext()、 [sig]longjmp()、[sig]setjmp()、 vfork() がこれに相当します。
exit(2) などの値を返さない関数では、奇妙な出力が生成される場合があります。また、自分が復帰する前に他の追跡されている関数を呼び出す関数でも、若干おかしい出力が生成されます。
セキュリティ上の理由から、setuid/setgid プログラムに対して apptrace を実行できるのは root だけです。
varargs.h の取り込みを必要とする関数 (vwprintw(3XCURSES) や vwscanw(3XCURSES) など) を追跡するときは、引数の出力は書式化されません。
次の属性については、attributes(5)のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
使用条件 | SUNWcstl (32 ビット) |
SUNWcstlx (64 ビット) |