1linerでstraceやltrace

だいぶ前に書いた、引数に指定したC言語のコードを実行するスクリプト、ce。

何となく作ってみた。Cでワンライナー(1liner)っぽいものが書けます。

これを拡張して、ltraceやstraceが簡単に実行できるようにしてみました。

Binary Hacksのお伴にいかがでしょう。


コードは CodeRepos に置いてあります。→ http://coderepos.org/share/browser/lang/shellscript/misc/ce

使い方

ceコマンド自体の使い方は、上記の記事か、ce -h でヘルプを参照してください。


今回の拡張で、-L オプションを付けると、与えたコードを即 ltrace できるように。

 % ce -L -m 'exit(1)' 2>&1 | tail -2
exit(1 <unfinished ...>
+++ exited (status 1) +++

と、exit(1)すると(glibcの)exitを呼んでいて、戻ってこないことが分かる。まあ当然ですね。


今度は -S オプションを付けて strace してみると、

 % ce -S -m 'exit(1)' 2>&1 | tail -1
 exit_group(1)                     = ?

というわけで、glibcのexitは名前そのままにexitシステムコールを呼ぶのではなく、exit_groupシステムコールを呼ぶのだということが分かります。*1
(なおexit_groupは同じプロセスのスレッドも終了させるシステムコール。)

他にも、ライブラリではsigaction()なのにsigactionシステムコールではなくrt_sigactionシステムコールを呼んだりとか、必ずしも名前通りのシステムコールを呼んでいないのが調べられたりします。

*1:ちなみにexit(2)のMANPAGEにも、ちゃんとそう書いてあります。