(如果您想了解我是如何安装 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