Датчик DTrace END никогда не срабатывает
У меня есть MacBook Pro середины 2009 года и новый MacBook Pro 2012 года, и я нахожусь в процессе изучения DTrace (довольно удивительный инструмент). Когда я вычисляю агрегаты на новом MBP 2012, агрегаты не распечатываются.
sudo dtrace -n 'syscall:::entry { @[execname] = count() }'
На моем MBP в середине 2009 года он показывает что-то вроде:
usbmuxd 1
GrowlHelperApp 2
imklaunchagent 2
installd 2
stackshot 2
...
MBP 2012 не показывает ничего.
Я добавил printf в зонд BEING и END, чтобы посмотреть, будет ли зонд END срабатывать так:
BEGIN
{
printf("Hi!");
}
syscall:::entry
{
@[execname] = count();
}
END
{
printf("Bye!")
}
В середине 2009 года MBP сработали и распечатались оба зонда, а на MBP 2012 года сработал только датчик BEGIN. КОНЕЦ никогда не стрелял.
Оба MBP работают под управлением Lion 10.7.3. Я не уверен, что попробовать дальше. Единственное отличие, которое приходит мне на ум, заключается в том, что я не установил инструменты командной строки разработчика на MBP 2012. Это просто не имеет смысла для меня, хотя и выстрел в темноте.
Любая помощь или идеи будут оценены. Благодарю.
============= [Включен корневой аккаунт]====================
Поэтому я включил учетную запись root и снова запустил команду
sudo dtrace -n 'syscall:::entry { @[execname] = count() }'
безуспешно, но если я сделаю
su
dtrace -n 'syscall:::entry { @[execname] = count() }'
оно работает!
============= [kill -s INT]=============================
Я сделал немного больше экспериментов. Если я бегу:
sudo kill -s INT [pid of dtrace]
все работает и выводится на экран.
Если я бегу:
sudo kill -s INT [pid of sudo running dtrace]
это тоже работает!
Но если я использую control-c в терминале, он не показывает вывод.
В чем разница между control-c и kill -s INT?
1 ответ
Я заметил, что на Linux тоже.
Ctrl-C не работает, если dtrace порожден sudo.
Если вы sudo -i, чтобы получить корневую оболочку, а затем вызвать dtrace, это работает.