dtrace в linux не всегда удаляет пользовательские зонды при выходе из программы — почему?

(См. Конец этого поста, если вы хотите увидеть, как я установил 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

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]