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にも、ちゃんとそう書いてあります。