(私がどのように dtrace をインストールしたかを知りたい場合は、この投稿の最後を参照してください。ここでは、既にインストールされているものと仮定します)
次の手順に従って、まったく問題のないカスタム プローブを作成しました。
A. _ プローブ定義で thing.d を作成します
provider thing {
probe test();
};
B.シンプルな main.cpp を作成する
#include "thing.h"
int main()
{
// Fire my probe
THING_TEST();
// Something to prevent immediate exit
for(;;)
sleep(1);
// Bye
return 0;
}
C. main.cpp をコンパイルします (ただし、リンクはしません)。_DTRACE_VERSION を定義する方法に注意してください。そうしないと、thing.h でプローブがコメントアウトされます。
g++ -D _DTRACE_VERSION -c main.cpp -o main.o
D.プローブ オブジェクト ファイルを作成します (このファイルの一部として main.o を含める必要があることに注意してください)。
dtrace -G -s thing.d -o thing.o main.o
E.すべてをリンクする
g++ main.o thing.o -o thing
問題は次のとおりです。アプリを実行し、CTRL-C で終了します (明らかに、無限ループのため、アプリは自動的に停止しません...)。
実際、これを数回行います。
次に、スーパーユーザー端末から:
# dtrace -l | grep thing
322991 thing28217 thing main test
322992 thing28403 thing main test
322994 thing28636 thing main test
こいつらはぶらぶらしてるだけだ...まるで登録解除などされていないようだ。「ps」を実行して、これらの pid (28217、28403、28636) を持つ proc があるかどうかを確認しましたが、何もありません。
興味深いことに、main.cpp から無限ループ (sleep() ループ) を削除し、アプリをすぐに終了させると、プローブが適切に削除されます。この問題は、sleep() 内で検出された CTRL-C に関係しているようです。おそらく、ある種の atexit() ハンドラが呼び出されていませんか?
これが私のシステム情報です:
$ uname -a
Linux beavis 3.5.0-26-generic #42-Ubuntu SMP Fri Mar 8 23:18:20 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$ g++ --version
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
DTRACE のインストール
Ubuntu に付属しているデフォルトの dtrace は使用していませんが、次のようにインストールした dtrace4linux を使用しています。
http://askubuntu.com/questions/60940/how-do-i-install-dtrace
注: Paul Fox のサイトの最新バージョンを使用しています。
ftp://crisp.dyndns-server.com/pub/release/website/dtrace/dtrace-20130317.tar.bz2