Linuxの挙動を徹底解析!straceでシステムコールをトレースする方法

Linuxでプログラムの動作がおかしい、なぜかエラーになる、ファイルにアクセスできない――そんなトラブルシューティングの場面で強力な味方となるのが「strace」コマンドです。straceは、実行中のプログラムがOSとどのようにやり取りしているのかを「システムコール」のレベルで追跡・記録することができます。これは、Linuxカーネルに対してどのような要求が行われているのかを明らかにするための重要なツールです。本記事では、straceの基本的な使い方から、よくある活用例、トラブルシューティングへの応用まで、実用的な内容をわかりやすく解説します。


straceとは何か?その役割と基本概念

straceは、「System Trace」の略で、Linux上で動作しているプロセスのシステムコール(syscall)をトレース(追跡)するためのコマンドです。ユーザー空間のプログラムがOSの機能を利用する際、ファイルの読み書き、プロセスの生成、ネットワーク通信など、カーネルに対して何らかの「リクエスト」を出します。このリクエストがシステムコールであり、straceはそれらを監視・記録します。

たとえば、以下のような操作がトレースされます。

  • open():ファイルを開く
  • read() / write():ファイルやソケットを読み書き
  • fork() / execve():プロセスの生成
  • connect() / accept():ソケット通信の確立

これにより、プログラムが内部で何をしているのかが手に取るようにわかるのです。


straceの基本的な使い方

straceを使うには、以下のようにコマンドの前に付けるだけです。

strace コマンド名 [引数]

例:lsコマンドをstraceでトレースする

strace ls

これを実行すると、lsコマンドが起動中に呼び出している全てのシステムコールが表示されます。標準出力に大量の出力が流れてくるので、最初は戸惑うかもしれませんが、慣れてくると有用な情報を素早く拾い上げられるようになります。


特定のシステムコールだけを追跡する

straceにはフィルター機能があり、特定のシステムコールだけを絞って表示することが可能です。

strace -e trace=open,read,write ls

この例では、open(), read(), write()というファイル関連のシステムコールだけを表示します。ノイズを減らして必要な情報に集中するために便利なオプションです。

また、以下のようにネットワーク関連の呼び出しだけに絞ることも可能です:

strace -e trace=network curl example.com

出力をファイルに保存する

標準出力に表示される内容をファイルに保存するには、-oオプションを使用します。

strace -o trace.log ls

このようにすると、システムコールの内容がtrace.logというファイルに保存され、後でゆっくり確認することができます。特に複雑なプログラムをトレースする場合に重宝します。


既存のプロセスにアタッチする

すでに起動しているプロセスを監視したい場合は、プロセスID(PID)を指定してstraceを使うことができます。

strace -p 12345

12345は対象プロセスのPIDです。例えば、Webサーバーなど常駐プロセスの動作確認に使われます。複数のPIDに同時アタッチすることも可能です。


トラブルシューティングに役立つstraceの実例

ファイルが開けない原因を調査

プログラムがファイルを開こうとして失敗している場合、straceを使えばエラーの原因がすぐにわかることがあります。

strace ./myapp

出力の中に以下のような行があれば:

open("/etc/myconfig.conf", O_RDONLY) = -1 ENOENT (No such file or directory)

これは「/etc/myconfig.confというファイルが存在しない」というエラーを意味します。ファイル名の間違いや、パーミッション設定の問題など、問題箇所が明確になります。

ネットワーク通信ができない原因を特定

たとえば、curlでサイトに接続できない場合に以下を試すと:

strace -e trace=network curl https://example.com

以下のような出力が出ることがあります:

connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("93.184.216.34")}, 16) = -1 ECONNREFUSED (Connection refused)

これは対象サーバーの443番ポートが拒否されていることを示しています。ファイアウォールやサービスの死活を疑う必要があります。


よく使うオプションまとめ

オプション内容
-e trace=...特定のシステムコールだけを表示
-o ファイル名出力をファイルに保存
-p PID既存プロセスにアタッチ
-f子プロセスのシステムコールも追跡
-tt時刻付きで出力
-Tシステムコールの実行時間を表示

これらのオプションを組み合わせることで、目的に応じた詳細なトレースが可能になります。


strace使用時の注意点

straceは非常に便利なツールですが、いくつか注意点もあります。

  • 実行するには対象プロセスへの権限が必要(通常はrootユーザー)
  • トレースによって対象プログラムのパフォーマンスが低下することがある
  • 大量の出力が発生するため、ログローテーションやフィルタリングが重要

本番環境での利用には慎重を期すべきですが、開発・テスト環境では積極的に活用すべきツールです。


まとめ

straceは、Linuxの世界における強力なデバッグ・トレースツールのひとつです。システムコールという低レベルのやりとりを可視化することで、プログラムの挙動を深く理解し、トラブルの原因を明らかにすることができます。基本的な使い方をマスターしておけば、ファイルアクセスの失敗、ネットワークエラー、パーミッション問題など、さまざまな問題解決に役立ちます。

「なんで動かないんだろう?」と感じたら、まずは一度straceで中を覗いてみましょう。そこには、解決のヒントが詰まっているかもしれません。

タイトルとURLをコピーしました