GNU/Linux >> Linux の 問題 >  >> Linux

Linux でプログラムの実行をデバッグするための 7 つの Strace の例

Strace は、問題のトラブルシューティングに役立つデバッグ ツールです。

Strace は、特定のプログラムのシステム コールとシグナルを監視します。ソースコードがなく、プログラムの実行をデバッグしたい場合に役立ちます。 strace は、バイナリの実行シーケンスを最初から最後まで提供します。

この記事では、開始するための 7 つの strace の例について説明します。

1.実行可能ファイルの実行をトレース

strace コマンドを使用して、実行可能ファイルの実行をトレースできます。次の例は、Linux ls コマンドの strace の出力を示しています。

$  strace ls
execve("/bin/ls", ["ls"], [/* 21 vars */]) = 0
brk(0)                                  = 0x8c31000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=65354, ...}) = 0
...
...
...

2.オプション -e を使用して実行可能ファイル内の特定のシステム コールをトレースする

デフォルトでは、strace は指定された実行可能ファイルのすべてのシステム コールを表示します。特定のシステム コールのみを表示するには、以下に示すように strace -e オプションを使用します。

$ strace -e open ls
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
open("/lib/librt.so.1", O_RDONLY)       = 3
open("/lib/libacl.so.1", O_RDONLY)      = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/lib/libdl.so.2", O_RDONLY)       = 3
open("/lib/libpthread.so.0", O_RDONLY)  = 3
open("/lib/libattr.so.1", O_RDONLY)     = 3
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
Desktop  Documents  Downloads  examples.desktop  libflashplayer.so 
Music  Pictures  Public  Templates  Ubuntu_OS  Videos

上記の出力には、ls コマンドの open システム コールのみが表示されます。 strace 出力の最後に、ls コマンドの出力も表示されます。

複数のシステム コールをトレースする場合は、「-e trace=」オプションを使用します。次の例は、open システム コールと read システム コールの両方を表示します。

$ strace -e trace=open,read ls /home
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
read(3, "\177ELF\1\1\1\3\3\1\260G004"..., 512) = 512
open("/lib/librt.so.1", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\3\3\1\300\30004"..., 512) = 512
..
open("/lib/libattr.so.1", O_RDONLY)     = 3
read(3, "\177ELF\1\1\1\3\3\1\360\r004"..., 512) = 512
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 315
read(3, "", 1024)                       = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
bala

3.オプション -o を使用してトレース実行をファイルに保存する

次の例では、strace 出力を output.txt ファイルに保存します。

$ strace -o output.txt ls
Desktop  Documents  Downloads  examples.desktop  libflashplayer.so
Music  output.txt  Pictures  Public  Templates  Ubuntu_OS  Videos

$ cat output.txt 
execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0
brk(0)                                  = 0x8637000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7860000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0
...
...

4.オプション -p を使用して実行中の Linux プロセスで Strace を実行する

プロセス ID を使用して、既に実行されているプログラムで strace を実行できます。まず、ps コマンドを使用してプログラムの PID を特定します。

たとえば、現在実行中の Firefox プログラムで strace を実行する場合は、Firefox プログラムの PID を特定します。

$ ps -C firefox-bin
  PID TTY          TIME CMD
 1725 ?        00:40:50 firefox-bin

以下に示すように strace -p オプションを使用して、特定のプロセス ID の strace を表示します。

$  sudo strace -p 1725 -o firefox_trace.txt

$ tail -f firefox_trace.txt

これで、firefox プロセスの実行トレースが firefox_trace.txt テキスト ファイルに記録されます。このテキスト ファイルを末尾に表示して、Firefox 実行可能ファイルのライブ トレースを監視できます。

ユーザー ID が指定されたプロセスのユーザー ID と一致しない場合、strace は次のエラーを表示します。

$  strace -p 1725 -o output.txt
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

5.オプション -t を使用して各トレース出力行のタイムスタンプを出力

各 strace 出力行のタイムスタンプを出力するには、以下に示すようにオプション -t を使用します。

$ strace -t -e open ls /home
20:42:37 open("/etc/ld.so.cache", O_RDONLY) = 3
20:42:37 open("/lib/libselinux.so.1", O_RDONLY) = 3
20:42:37 open("/lib/librt.so.1", O_RDONLY) = 3
20:42:37 open("/lib/libacl.so.1", O_RDONLY) = 3
20:42:37 open("/lib/libc.so.6", O_RDONLY) = 3
20:42:37 open("/lib/libdl.so.2", O_RDONLY) = 3
20:42:37 open("/lib/libpthread.so.0", O_RDONLY) = 3
20:42:37 open("/lib/libattr.so.1", O_RDONLY) = 3
20:42:37 open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
20:42:37 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
20:42:37 open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
bala

6.オプション -r を使用してシステム コールの相対時間を表示

Strace には、以下に示すように、各システム コールの実行時間を出力するオプションもあります。

$ strace -r ls 
     0.000000 execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0
     0.000846 brk(0)                    = 0x8418000
     0.000143 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
     0.000163 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb787b000
     0.000119 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
     0.000123 open("/etc/ld.so.cache", O_RDONLY) = 3
     0.000099 fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0
     0.000155 mmap2(NULL, 67188, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb786a000
     ...
     ...

7.オプション -c を使用してシステム コールの統計レポートを生成する

オプション -c を使用すると、strace は実行トレースの有用な統計レポートを提供します。次の出力の「calls」列は、その特定のシステム コールが実行された回数を示しています。

$ strace -c ls /home
bala
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0         9           read
  -nan    0.000000           0         1           write
  -nan    0.000000           0        11           open
  -nan    0.000000           0        13           close
  -nan    0.000000           0         1           execve
  -nan    0.000000           0         9         9 access
  -nan    0.000000           0         3           brk
  -nan    0.000000           0         2           ioctl
  -nan    0.000000           0         3           munmap
  -nan    0.000000           0         1           uname
  -nan    0.000000           0        11           mprotect
  -nan    0.000000           0         2           rt_sigaction
  -nan    0.000000           0         1           rt_sigprocmask
  -nan    0.000000           0         1           getrlimit
  -nan    0.000000           0        25           mmap2
  -nan    0.000000           0         1           stat64
  -nan    0.000000           0        11           fstat64
  -nan    0.000000           0         2           getdents64
  -nan    0.000000           0         1           fcntl64
  -nan    0.000000           0         2         1 futex
  -nan    0.000000           0         1           set_thread_area
  -nan    0.000000           0         1           set_tid_address
  -nan    0.000000           0         1           statfs64
  -nan    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   114        10 total

Linux
  1. Linuxでのコマンドまたはプロセスの実行時間を検索する

  2. Linux プロセスのパフォーマンスの問題をデバッグするための 10 の pidstat の例

  3. シェルでプログラムの実行時間を取得する

  1. Linux Sedコマンド:使用法と例

  2. Linuxでのddコマンドの5つの実用例

  3. Linux での有害な可能性があるプログラムの実行

  1. Linuxでのファイルコマンドの基本的な例

  2. LinuxでのSplitコマンドの9つの便利な例

  3. Linuxでの解凍コマンドの実用例