【Linux】straceコマンドの使い方・デバッグ活用ガイド

【Linux】straceコマンドの使い方・デバッグ活用ガイド

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:3,330

Linuxのプロセスが発行するシステムコールを追跡できるstraceコマンドの使い方を初心者向けに解説。基本的な見方から、-p(プロセスへのアタッチ)、-o(ファイル出力)、-e(絞り込み)などの主要オプションの活用法、ログに出ないエラーの調査手法まで網羅的に紹介します。

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

初心者向け

わかばちゃんと学ぶ サーバー監視

難易度
実用性
読みやすさ

マンガと図解が中心で圧倒的に読みやすい。負荷調査の手法がスッと理解できるようになります。

新しいLinuxの教科書 第2版

難易度
実用性
読みやすさ

一生モノの基礎知識が身につく定番書です。

ゼロからわかる Linuxコマンド200本ノック―基礎知識と頻出コマンドを無理なく記憶に焼きつけよう!

難易度
実用性
習得度

アウトプット重視で記憶に定着しやすい。反復練習でLinux操作が自由自在になります。

エンジニア1年生のための世界一わかりやすいLinuxコマンドの教科書

難易度
実用性
読みやすさ

LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルシステムにおいて、「プログラムが急に止まってしまった」「ログにエラーが出ないのにアクセス権限で弾かれる」といった、原因不明のトラブルに直面したことはありませんか? そんな時に非常に役立つのが、 プロセスが発行するシステムコールとシグナルをトレース(追跡)できる「straceコマンド」 です。

本記事では、straceコマンドの基本的な使い方と出力情報の見方、実践的な活用方法までを初心者にもわかりやすく解説します。

記事のポイント

  • straceはプロセスのシステムコール(OSOS [オーエス]Operating System。基本ソフトウェアへの要求)を追跡するデバッグツール。
  • ログに残らない根本原因(Permission denied や File not found など)の特定に強い。
  • -p(実行中プロセスへのアタッチ)、-o(ファイル出力)などのオプションが重要。
  • -eオプションで特定のシステムコールのみを絞り込むと調査がスムーズ。
  • 出力内容が膨大になるため、リダイレクトやファイル出力を活用するのが基本。

straceとは?何ができるコマンドなのか

strace(system call trace)は、プログラムとLinuxカーネルの間のやり取り、すなわちシステムコールを監視・記録するコマンドです。

プログラムは単独で動いているわけではなく、ファイルを開く(open)、データを読み書きする(read / write)、メモリを確保する(mmap)といった動作を行う際、必ずOS(カーネル)に処理を依頼します。これが「システムコール」です。

straceを使えば、「プログラムがOSに対してどのような要求を出し、その結果どうなったか(成功したか、エラーが発生したか)」をリアルタイムで覗き見ることができます。そのため、アプリケーション側のエラーログだけでは分からないような、インフラレベルの根本原因を特定するのに非常に強力なツールとなります。

straceコマンドの主な用途

  • ログに原因が出ないエラーの調査: アプリケーション側で「エラーが発生しました」としか表示されない場合でも、「どのファイルへのアクセスで権限エラーが出たか」を特定できます。
  • 設定ファイルの確認: プログラムが起動時に「どの設定ファイルを読み込もうとしているか」「どの順序で読み込んでいるか」を追跡できます。
  • プロセスのハングアップ(フリーズ)調査: どの処理(システムコール)で処理が止まっているかを確認できます。

straceの基本構文と主要なオプション

straceの基本構文

Terminal window
# 新しくコマンドを実行して追跡する場合
strace [オプション] コマンド [コマンドの引数]
# すでに実行中のプロセスを追跡する場合
strace -p [プロセスID(PID)]

注意点: straceを実行するには、原則として対象プロセスの所有者であるか、または root権限(sudosudo [スードゥー / スーデュー]Superuser doの略。一時的に他のユーザー(主に管理者特権)の権限でコマンドを実行する が必要です。

【補足】実務では「ほぼsudo必須」と考えましょう
Linuxカーネルのセキュリティ機構(Yama LSMの ptrace_scope)により、UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューションなどの多くのディストリビューションでは、同じユーザーであっても自分の子プロセスでない別プロセスへのアタッチがroot権限なしでは拒否されるようデフォルトで設定されています(ptrace_scope=1)。そのため、実務の現場においては「`strace -p` を使うならsudoが前提」と考えておくとスムーズです。

straceでよく使われるオプション一覧

オプション内容使用例
-p PID指定したPIDの実行中プロセスにアタッチするsudo strace -p 1234
-o ファイル実行結果を標準エラー出力ではなく、指定したファイルに出力するstrace -o trace.log ls
-f子プロセス(fork/vforkで生成されたプロセス)も追跡する。マルチプロセスの調査に必須strace -f -p 1234
-e expr特定のイベント(システムコールなど)に絞り込んで表示するstrace -e open,read
-t / -tt各システムコールが発行された時刻を表示(-ttはマイクロ秒単位)strace -tt -p 1234
-T各システムコールの処理に要した時間を表示する。処理の遅延(ボトルネック)調査に必須strace -T -p 1234
-cシステムコールの実行回数、エラー回数、所要時間などの統計情報を集計して表示するstrace -c ls
-s サイズ文字列を表示する際の最大文字数を指定(デフォルトは32)。長いSQLSQL [エスキューエル / シークエル]Structured Query Language。関係データベース(RDB)の管理や操作を行うデータベース言語などを確認したい場合に有効strace -s 1024 -p 1234

straceの出力情報の見方

straceを実行すると、膨大なログが出力されます。基本的な見方を押さえておきましょう。

Terminal window
$ strace cat /etc/hostname
execve("/usr/bin/cat", ["cat", "/etc/hostname"], 0x7ffd5...) = 0
brk(NULL) = 0x55bc2...
...(中略)...
openat(AT_FDCWD, "/etc/hostname", O_RDONLY) = 3
read(3, "myserver\n", 131072) = 9
write(1, "myserver\n", 9myserver
) = 9
close(3) = 0
...

出力の基本構造は以下のようになっています。 システムコール名(引数1, 引数2, ...) = 戻り値 [エラー内容]

  • システムコール名: 実行された処理(open, read, write, close など)
  • 引数: 処理に渡された値(ファイルパスやファイルディスクリプタ番号など)
  • 戻り値: 処理の結果(成功した場合は正の数や0、失敗した場合は -1
  • エラー内容: 失敗した場合(戻り値が-1の場合)、エラーの定数と詳細(例: ENOENT (No such file or directory)

注目すべき重要なシステムコール

システムコール役割・意味
open / openatファイルを開く。ファイルが見つからない(ENOENT)か、権限がない(EACCES)かを見るのに重要
readファイルやソケットからデータを読み込む
writeファイルやソケットにデータを書き込む
closeファイルを閉じる
connectネットワーク接続を開始する
stat / fstatファイルの状態(サイズや権限など)を取得する(※実際のログでは newfstatat として出力されることが多いです)

現場で使える!straceの活用例

straceの活用例~実行中プロセスのトラブルを調査する(アタッチ)~

すでに動いているWebサーバなどが不調な場合、プロセスIDを指定して調査します。

Terminal window
sudo strace -p 1234 -f

1234というPIDのプロセスと、その子プロセス(-f)の動きをリアルタイムで監視します。Ctrl+Cで終了すると、プロセスはそのまま動き続けます(straceのみが終了します)。

straceの活用例~出力結果をファイルに保存する~

straceは出力が非常に多いため、画面で追うのは困難です。必ずファイルに出力しましょう。

Terminal window
sudo strace -p 1234 -o strace_output.log

後から grep コマンドなどで strace_output.log の中身を「ENOENT(ファイルなし)」や「EACCES(権限エラー)」で検索すると、問題箇所を素早く特定できます。

straceの活用例~特定のシステムコールだけを絞り込む~

ファイルアクセスに関するエラーを調査したい場合、ネットワーク通信などを省いて open 関連だけに絞ると見やすくなります。

Terminal window
strace -e open,openat,stat cat /etc/hostname

ネットワーク関連の問題(DBに接続できないなど)を調べる場合は、-e trace=network または -e %network(ネットワーク関連のシステムコールを一括指定)が便利です。

straceの活用例~パフォーマンスのボトルネックを特定する(統計機能)~

プログラムの処理に時間がかかっている場合、どのシステムコールにどれだけの時間を消費しているかをサマリーで確認できます。

Terminal window
strace -c ls /

実行が完了すると、呼び出された回数(calls)やエラー回数(errors)、処理に費やした時間の割合(% time)などが表形式で表示されます。

まとめ:straceを使いこなすために

  • straceは、プログラムがOSに要求する処理(システムコール)を覗き見できる強力なツール。
  • トラブルシューティングの際、「ファイルがないのか」「権限がないのか」「ネットワークが繋がらないのか」をインフラレベルから調査できる。
  • -pで実行中プロセスにアタッチ、-oでファイル出力、-fで子プロセスの追跡を組み合わせるのが基本。
  • -eオプションで特定の処理に絞り込んだり、-cで統計情報を取ることで、効率的に原因究明が可能。

アプリケーションのログだけでは解決できない難問に直面したときは、ぜひstraceコマンドを活用してみてください。システムのブラックボックスが透明になり、問題解決のスピードが劇的に向上するはずです。


以上で本記事の解説を終わります。
よいITライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

人気記事


記事を評価

Thanks!
目次
Scroll to Top