sotrussやapptraceによる実行コマンドのトレースUNIX処方箋

「事件は枯れたシステムが稼働する現場で起こってるんだ」と現場ですぐに役立つ知識を欲するあなたに贈る珠玉のTips集。今回は、実行コマンドが使用している共有ライブラリや関数を知るための方法を紹介する。

» 2007年12月04日 00時00分 公開
[ITmedia]

現在、Solaris 8を利用しています。実行コマンドが使用している共有ライブラリや関数を知りたいのですが、どのような方法で調査できますか?


実行中のコマンドが使用しているライブラリや関数は、sotrussコマンドやapptraceコマンドで調査できます。以下に、各コマンドの特徴や使用方法を説明しておきます。

共有ライブラリをトレースするsotruss

 sotrussコマンドは、共有ライブラリ関数の呼び出しをトレースするものです。これを使用するには、インストールメディアの中にあるProgramming Tools(パッケージ名SUNWtoo)を導入しておく必要があります。

 sotrussコマンドの書式は、次のとおりです。

sotruss [<オプション>] <コマンド>


 オプションとしては、実行プロセス番号を表示する「-f」オプションなどが指定可能です。詳細については、sotrussのオンラインマニュアルを参照してください。

 ここで、「nslookup www.dtc.co.jp」に対して調査した結果を示しておきます(実行例1)


# sotruss nslookup www.dtc.co.jp
nslookup           ->       libc.so.1:*atexit(0xff3bce64, 0x2b400, 0x0)
nslookup           ->       libc.so.1:*atexit(0x19930, 0xff03c004, 0xff3bce64)
nslookup           ->       libresolv.so.2:*res_ninit(0x2ee98, 0xff0420d8, 0xff03e5d0)
nslookup           ->       libc.so.1:*.mul(0x1, 0x18, 0xff1e25ac)
nslookup           ->       libc.so.1:*_sigemptyset(0xffbef9f8, 0xff2e05ac, 0xff331598)
                        :
                        :
nslookup           ->       libc.so.1:*_fprintf(0x2ed68, 0x1b1b8, 0xff043a4c) 210.171.66.2
Aliases:nslookup    ->      libc.so.1:*strlen(0x31590, 0x9, 0xff043a4c)
nslookup           ->        libc.so.1:*_fprintf(0x2ed68, 0x1b1c8, 0x20)
nslookup           ->        libc.so.1:*_fprintf(0x2ed68, 0x1b208, 0x19) www.dtc.co.jp
nslookup           ->        libc.so.1:*exit(0x0, 0x0, 0x2e9c4)

実行例1 sotrussコマンドの実行

 ここでは、

nslookup -> libc.so.1:*atexit(0xff3bce64, 0x2b400, 0x0)


のように出力されていますが、それぞれ次のような内容を示しています。

nslookup:実行コマンド

libc.so.1:実行コマンドから呼び出されたライブラリ名

*atexit:呼び出されたライブラリ関数

(0xff3bce64, 0x2b400, 0x0):ライブラリ関数の引数(最大3つまで)


アプリケーション関数をトレースするapptrace

 apptraceコマンドは、アプリケーション関数の呼び出しをトレースするものです。これを使用するには、Solaris 8以降の環境で、Apptrace Utility(パッケージ名SUNWcstl/SUNWcstlx*)を導入しておく必要があります。

apptraceコマンドの書式は、次のとおりです。

apptrace[<オプション>]<バイナリ名またはライブラリ名>


 オプションとしては、指定ライブラリの動作のみ追跡する「-T」オプションなどがあります。詳細については、apptraceのオンラインマニュアルを参照してください。

 先ほどの「nslookup www.dtc.co.jp」に対して実行すると、実行例2のような結果が出力されます。


# apptrace nslookup www.dtc.co.jp
nslookup -> libc.so.1:atexit(func = 0xff3bce64) = 0x0
nslookup -> libc.so.1:atexit(func = 0x19930) = 0x0
nslookup -> libresolv.so.2:res_ninit(0x2ee98, 0xffbefac4, 0x0)
                        :
                        :
nslookup -> libc.so.1:_fprintf(0x2ed68, 0x1b1b8, 0xfed43a4c)
210.171.66.2
Aliases:nslookup -> libc.so.1:strlen(s = "www.dtc.co.jp") = 0xd
nslookup -> libc.so.1:_fprintf(0x2ed68, 0x1b1c8, 0x20)
nslookup -> libc.so.1:_fprintf(0x2ed68, 0x1b208, 0x19) www.dtc.co.jp
nslookup -> libc.so.1:exit(status = 0)

実行例2 apptraceコマンドの実行

 ここでは、

nslookup -> libc.so.1:_fprintf(0x2ed68, 0x1b208, 0x19) www.dtc.co.jp


のように出力されていますが、それぞれ次のような内容を示しています。

nslookup:実行コマンド

libc.so.1:実行コマンドから呼び出されたライブラリ名

_fprintf:呼び出されたライブラリ関数

(0x2ed68, 0x1b208, 0x19):ライブラリ関数の引数

www.dtc.co.jp:ライブラリ関数の復帰値


このページで出てきた専門用語

SUNWcstl/SUNWcstlx

SUNWcstlは32ビット環境用、SUNWcstlxは64ビット環境用。


関連キーワード

Solaris | UNIX | UNIX処方箋


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ