プロセスのコール・シグナルを追うtruss/straceコマンド
コマンドの説明
IBM Knowledge Center - truss コマンドより抜粋。
プロセスのシステム・コール、動的にロードされたユーザー・レベル機能のコール、 受信されたシグナル、引き起こされたマシン・フォールトをトレースします。
どんなときに使うの?
シェルやミドルウェアのトラブルで、以下のようなときに問題解決に使えます。
- psしてもよく分からない
- ログに何も残っていない
- 現象が発生するが原因がつかめない
- 不審なプロセスを発見したのでどんな動きをしているのか調査したい
コマンド実行例
findコマンドに対してtrussした例がこちら。
$ truss find .
execve("/usr/bin/find", 0x2FF22AE8, 0x20013AC8) argc: 2
read_sysconfig(0xF07A5058, 0x00000010, 0xFFFFFFFD, 0x10000000, 0x30000930, 0x00000080, 0x06010000, 0xF08172A0) = 0x00000000
sbrk(0x00000000) = 0x301A1B7C
vmgetinfo(0x2FF22420, 7, 16) = 0
sbrk(0x00000000) = 0x301A1B7C
sbrk(0x00000004) = 0x301A1B7C
__libc_sbrk(0x00000000) = 0x301A1B80
sys_parm(0, 14, 0x2FF22980) = 0
__libc_sbrk(0x00000000) = 0x301B1B90
getuidx(4) = 10005
getuidx(2) = 10005
getuidx(1) = 10005
getgidx(4) = 400
getgidx(2) = 400
getgidx(1) = 400
__loadx(0x01480080, 0x2FF21680, 0x00000A50, 0x2FF221E0, 0x00000000) = 0xD06D0128
(中略)
close(5) = 0
kfcntl(1, F_GETFL, 0x00000000) = 67110914
kfcntl(1, F_GETFL, 0x0001AF70) = 67110914
kfcntl(2, F_GETFL, 0x2FF22FFC) = 67110914
_exit(0)
Linuxの場合、straceコマンドを使います。
# strace find . | more
execve("/bin/find", ["find", "."], [/* 28 vars */]) = 0
brk(0) = 0x1336000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdf40749000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=100642, ...}) = 0
mmap(NULL, 100642, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf40730000
close(3) = 0
open("/lib64/librt.so.1", O_RDONLY) = 3
(中略)
close(3) = 0
close(1) = 0
munmap(0x7fdf40746000, 4096) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
.