概要
straceについての備忘録です。
個人的に利用頻度は高くないですが、時々実行しようとすると忘れていることが多いので
まとめておきます。
straceについて
straceは実行中のプログラムが呼んだシステムコールを表示してくれるツールです。
straceの結果から、どのシステムコールで待っているのか・OSの何の関数で待機しているかが確認可能です。
アプリケーションプログラムが内部でどの部分で待機しているかは確認できません。
インストール(CentOS)
CentOS
yum install strace
ubuntu
apt-get install strace
オプション(使用頻度が高いもの)
Options | Description |
---|---|
s | 表示する最大文字列サイズを指定(デフォルトは32)。システムコールなどで読み書きした内容を全て確認したい場合は大きくする。 |
tt | 行頭にタイムスタンプを出力(マイクロ秒) |
T | 行末にシステムコールに費やした時間(※)を表示。※各システムコールの開始と終了の間の時間差を記録 |
ff | 子プロセスのシステムコールもトレース。-oが有効な場合プロセス(スレッド)毎に別ファイルに出力 |
o | 指定したファイル名に出力。-ffとの併用で ファイル名. に出力 |
p | プロセスIDを指定 |
e | どのイベントをトレースするか、またはどのようにトレースするかを変更する修飾表現 |
c | システムコールごとに統計情報(時間/呼び出し/エラーのカウント)を表示 |
r | システムコールが要した時間を出力 |
-f オプションの場合、別プロセスのトレース結果が同一ファイルに出力される。
別ファイルにしたい場合は、-ff オプションにすれば良い。
基本的な使用方法
$ strace [command]
実行例
- 実行コマンドのトレース「$ strace <実行コマンド>」
$ strace ls
- ファイルのトレース「$ strace <./ファイル名>」
$ strace ./hello >/dev/null
- 確認するシステムコールを限定する「$ strace -e trace=<システムコール名(,システムコール名)>」
$ strace -e trace=open,read,write,close ./hello data >/dev/null
- PIDを指定してstrace 「$ strace -p
」
$ strace -p 1111
- トレース結果をファイル出力「$ strace -o <出力ファイル>」
$ strace -o strace-output.txt ls
- システムコールが要した時間を出力「$ strace -r」
$ strace -r ls
- トレース結果の統計情報を出力「$ strace -c」
$ strace -c ls
- 実行時刻(秒単位)の表示(-t)「$ strace -t」
$ strace -t -p 2298
- 実行時刻(マイクロ秒単位)の表示(-tt)「$ strace -t」
$ strace -tt -p 2298
- 実行時間の表示方法(-T)「$ strace -T」
$ strace -T -p 2298
- 特定のシステムコールを実行結果から除外「$ strace -e 'trace=!<除外対象のシステムコール>'」※複数可
$ strace -e 'trace=!write' -p 1347
- 表示する文字列数を調整する(-s)「$ strace -s <数値>」
$ strace -s 100 -p 4159
- 実行結果をプロセス毎にわける方法(-ff)「$ strace -ff」
$ strace -ff -p 3311,3312,3313,3314,3315,3316 -o strace.log
実用的な使用方法
- システムコールの詳細確認
$ strace -Ttt -ff -s 1500000 -o <ログ出力先ファイル名> -p <PID>
$ strace -Ttt -ff -s 1500000 -o <ログ出力先ファイル名> <コマンド>
$ strace -Ttt -ff -s 1500000 -o /home/oracle/work/strace_ls.log ls dump strace_ls.log.15881 [oracle@consrsec work]$ head strace_ls.log.15881 02:37:42.710875 execve("/usr/bin/ls", ["ls"], [/* 55 vars */]) = 0 <0.000175> 02:37:42.711208 brk(0) = 0x7bb000 <0.000007> 02:37:42.711253 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1bd8854000 <0.000009> 02:37:42.711289 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000010> 02:37:42.711332 open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000013> 02:37:42.711378 stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64", 0x7ffca63648b0) = -1 ENOENT (No such file or directory) <0.000009> 02:37:42.711402 open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008> 02:37:42.711425 stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls", 0x7ffca63648b0) = -1 ENOENT (No such file or directory) <0.000017> 02:37:42.711458 open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) <0.000008> 02:37:42.711480 stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64", 0x7ffca63648b0) = -1 ENOENT (No such file or directory) <0.000007>
- システムコールの種類別に集計(時間・回数)
$ strace -fc -o <ログ出力先ファイル名> -p <PID>
$ strace -fc -o <ログ出力先ファイル名> <コマンド>
$ strace fc -o /home/oracle/work/strace_ls.log ls execve("/usr/bin/fc", ["fc", "-o", "/home/oracle/work/strace.log", "ls"], [/* 55 vars */]) = 0 brk(0) = 0x1fe7000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc2bb9c1000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/x86_64", 0x7ffe3891ae20) = -1 ENOENT (No such file or directory) open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/tls", 0x7ffe3891ae20) = -1 ENOENT (No such file or directory) open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib/x86_64", 0x7ffe3891ae20) = -1 ENOENT (No such file or directory) open("/u01/app/oracle/product/18.0.0/dbhome_1/lib/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) stat("/u01/app/oracle/product/18.0.0/dbhome_1/lib", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=113542, ...}) = 0 mmap(NULL, 113542, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc2bb9a5000 close(3) = 0 open("/lib64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\316\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=174576, ...}) = 0 mmap(NULL, 2268928, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc2bb577000 mprotect(0x7fc2bb59c000, 2097152, PROT_NONE) = 0 mmap(0x7fc2bb79c000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fc2bb79c000 close(3) = 0
見方
Column | Examples | Description |
---|---|---|
1 | 02:37:42.710875 | システムコール実行開始時刻(時:分:秒.マイクロ秒) |
2 | execve("/usr/bin/ls", ["ls"], [/ 55 vars /]) = 0 | システムコール |
3 | <0.000175> | システムコール実行に要した時間(秒.マイクロ秒) |
システムコールのマニュアル確認方法
man 2 <システムコール名>
例
- open
$ man 2 open
- write
$ man 2 write
参考資料
- ふつうのLinuxプログラミング
ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道
- 作者: 青木峰郎
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/09/22
- メディア: 単行本
- この商品を含むブログを見る
- 絵で見てわかるシステムパフォーマンスの仕組み
- 作者: 小田圭二,榑松谷仁,平山毅,岡田憲昌
- 出版社/メーカー: 翔泳社
- 発売日: 2014/06/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- ハロー"Hello World" OSと標準ライブラリの仕事としくみ
ハロー“Hello,World"OSと標準ライブラリのシゴトとしくみ
- 作者: 坂井弘亮
- 出版社/メーカー: 秀和システム
- 発売日: 2015/09/11
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 詳解システムパフォーマンス
http://blog.livedoor.jp/sonots/archives/18193659.html
- 作者: Brendan Gregg,西脇靖紘,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/02/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
https://yohei-a.hatenablog.jp/entry/20160612/1465701692
https://yohei-a.hatenablog.jp/entry/20150111/1420957702
https://qiita.com/hana_shin/items/a03150552e2f70994248
http://jitsu102.hatenablog.com/entry/20111231/1325322559