2

(如果您想了解我是如何安装 dtrace 的,请参阅本文结尾 - 现在我假设您已经安装了它)

我按照以下步骤制作了一个完全没有问题的自定义探针:

一个。用我的探针定义创建 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)的过程,不,没有。

有趣的是,如果我从 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