ltrace でスレッドをトレースすると変

ダイナミックライブラリの呼び出しをトレースできる便利な ltrace ですが、 ltrace -p でメインスレッド以外のスレッドのLWP番号を指定してトレースしようとすると変な挙動になるのに気がつきました。

変な挙動

[vagrant@vagrant-centos65 ~]$ sudo ltrace -p 2800
Cannot attach to pid 2800: No such file or directory

Cannot attach to pid と出ていますが、プロセスの STATUS は T になっています。あと ENOENT のエラーメッセージも出ています。さらにシグナルがブロックされていて Ctrl-C だと止められませんでした

ltrace を strace する

ENOENT の部分が気になったので ltrace の strace を取ると下記で ENOENT を返しているのが分かりました

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

ほいじゃ sudo touch /root/.ltrace.conf するとどうなるかなと実行したら

[vagrant@vagrant-centos65 ~]$ sudo touch /root/.ltrace.conf
[vagrant@vagrant-centos65 ~]$ sudo ltrace -p 2950
Cannot attach to pid 2950: Success

Cannnot で Success! 何を言っているんだお前は感。どうにもプロセスにアタッチする周りと errno の扱いがおかしいようですね

ltrace の man

-p pid としか説明が無いのでスレッドをトレースしようとするのがそもそも間違いなんでしょうかね

-p pid
Attach to the process with the process ID pid and begin tracing.

なんだかよくわからないまんまです。時間ができたらバグレポートを探してみます