「ふつうの Linux プログラミング」という本をラビットハウス社で輪読しているが、その中で strace コマンドというものが出てきた。

man STRACE(1)

man によると strace とはシステムコールとシグナルをトレースできるツールのようだ

  • NAME: strace – trace system calls and signals
  • SYNOPSIS: strace [-CdffhiqrtttTvVxxy] [-In] [-bexecve] [-eexpr]… [-acolumn] [-ofile] [-sstrsize] [-Ppath]… -ppid… / [-D] [-Evar[=val]]… [-uusername] command [args]
  • In the simplest case strace runs the specified command until it exits. It intercepts and records the system calls which are called by a process and the signals which are received by a process. The name of each system call, its arguments and its return value are printed on standard error or to the file specified with the -o option.

hello, world の strace

ハロワの strace を見てみよう。テスト対象のコードを書く必要もない気がするけど、次のとおり。

コンパイルして、strace を実行してみる。ちなみに実行環境は CentOS 7。

write(1, "Hello, World!\n", 14Hello, World!) = 14 とあるように標準出力に Hello, World!\n という文字列を write(2) しているのがわかる。 -c オプションをつけるとなんかかっこいい感じに統計情報をだしてくれる。

-e オプションでトレースしたいシステムコールを指定できる

echo のソースコード

ハロワを出力するだけなら echo で良いので、echo の strace をみてみた

echo なんかもおんなじ感じの出力になったので、ソースコードを探しに南米へと飛んだ

なるほどな… と思ってソースコード探そうとしたら江添さんがすでにいろんなUNIX環境での echo のソースコードについて比較している記事が引っかかった。ふむふむ〜。で、実際のソースコードがこれ。意外にながくてクソだるですわ…。結局最後のほうで、fputs, putchar を呼び出している感じで、これらは内部でバッファリングして、write を呼び出しているので、システムコールの呼び出しは 1回なのだろうみたいな感じの模様。

macOS で dtruss を使う

macOS では strace の代わりに dtruss を使えば同じようなことして遊べそう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です