2

(私がどのように 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
4

0 に答える 0