(См. Конец этого поста, если вы хотите увидеть, как я установил 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», чтобы увидеть, есть ли какие-нибудь проки с этими pids (28217, 28403, 28636) и нет, ничего там.
ИНТЕРЕСНО, если я удалю бесконечный цикл из main.cpp (цикл sleep ()) и просто позволю приложению немедленно выйти, тогда зонды будут удалены должным образом. Таким образом, похоже, что проблема связана с обнаружением CTRL-C внутри sleep () — возможно, не вызывается какой-то обработчик 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 УСТАНОВКА
Я не использую dtrace по умолчанию, который поставляется с Ubuntu, а скорее dtrace4linux, который я установил следующим образом:
http://askubuntu.com/questions/60940/how-do-i-install-dtrace
НОТАЯ использую последнюю версию с сайта Пола Фокса:
ftp://crisp.dyndns-server.com/pub/release/website/dtrace/dtrace-20130317.tar.bz2
Задача ещё не решена.
Других решений пока нет …