(如果你想看看我如何安装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