ablog

不器用で落着きのない技術者のメモ

strace の -y や -yy でFD番号と共にファイルパスやIPアドレス・ポート番号を表示する

strace を使う場合、プロセスが起動している間に lsof や /proc/[pid]/fd でファイルディスクリプタ(FD)番号とファイルパスの対応を確認しておかないと、read(17, ... などと出力されている場合に、17 のファイルパスがわからなくなりますが*1

  • strace 4.7 (2012年5月リリース) から -y でFD番号と対応するファイルパス
Noteworthy changes in release 4.7
=================================

...

* Improvements
  * Added x32 personality support (x86_64 architecture).
  * Added -y and -P options to print file descriptor paths and
    filter by those paths.
Noteworthy changes in release 4.10 (2015-03-06)
===============================================

* Improvements
  * Added -yy option to print protocol and address information associated with
    socket descriptors.

を表示してくれます。これは便利!

インストール

$ tar xfvJ strace-4.12.tar.xz 
$ cd strace-4.12
$ ./configure
$ make
  • ヘルプを見ると -y と -yy オプションが存在する。
$ ./strace -h|grep '\-y'
  -y             print paths associated with file descriptor arguments
  -yy            print protocol specific information associated with socket file descriptors

実行例

  • -y でFD番号とともにファイルパスを表示する
$ ./strace -y  ls > /dev/null
execve("/bin/ls", ["ls"], [/* 23 vars */]) = 0

...

open("/etc/ld.so.cache", O_RDONLY)      = 3</etc/ld.so.cache>
fstat(3</etc/ld.so.cache>★, {st_mode=S_IFREG|0644, st_size=41296, ...}) = 0
mmap(NULL, 41296, PROT_READ, MAP_PRIVATE, 3</etc/ld.so.cache>, 0) = 0x7f2de6449000
close(3</etc/ld.so.cache>)              = 0

FD番号"3"のパス"/etc/ld.so.cache"が表示されている。

参考

       -y          Print paths associated with file descriptor arguments.

       -yy         Print ip:port pairs associated with socket file
                   descriptors.
Add ability to print file descriptor paths and filter by those paths

...

(usage, main): Implement handling of -y and -P options.
* strace.1: Add descriptions of -y and -P options.
Add -yy option: print ip and port associated with socket descriptors
When two ore more -y options are given, print local and remote ip:port
pairs associated with socket descriptors. This implementation uses
NETLINK_INET_DIAG for sockaddr lookup; it's based on the patch
prepared by Zubin Mithra as a part of his GSoC 2014 strace project.

*1:ソケットの場合は /proc/net/tcp や /proc/net/udp でソケットのIPアドレスとポート番号を確認しておく必要がある