Linux上的dtrace并不总是在程序退出时删除userland探测器 - 为什么?

时间:2013-04-06 18:40:14

标签: c++ c linux dtrace

(如果你想看看我如何安装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)和nope,没有任何东西。

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

我没有使用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

0 个答案:

没有答案