Нам нужно адаптировать огромное количество существующих трасс, похожих на printf, к LTTNG. Одна из проблем, которую мы предвидим, заключается в том, что нам понадобится универсальная точка трассировки с форматом args плюс строка char *. Мы пытаемся найти способ избежать составления строки перед вызовом точки трассировки LTTNG. Есть ли какой-нибудь способ узнать заранее, будет ли точка трассировки «отслеживаться» перед передачей ее в библиотеку LTTNG? Любой метод, который мы можем вызвать, чтобы узнать, является ли трасса совпадением?
Большое спасибо!
Постскриптум Мы знаем, что иметь такую точку следа — плохая практика, но над нами проносятся миллионы линий.
использование tracepoint_enabled()
а также do_tracepoint()
макросы как показано ниже, код скопирован из справочная страница:
if (tracepoint_enabled(ust_tests_hello, tptest)) {
/* prepare arguments */
do_tracepoint(ust_tests_hello, tptest, i, netint, values,
text, strlen(text), dbl, flt);
}
Примечание: чтобы это работало, нужно иметь как минимум LTTng-UST 2.7.0-rc1
Технически вы можете запросить статус сеанса трассировки через liblttng-CTL. Однако, если ваша цель — повысить производительность, я не уверен, что просмотр этой библиотеки каждый раз, когда вы нажимаете на точку трассировки, будет более эффективным, чем форматирование строки. Вы должны были бы сравнить это.
Как примечание стороны, если вы перемещаете существующий printf()
звонки на точки трассировки LTTng, вы можете посмотреть на tracef()
, которая в основном является точкой трассировки в одной строке формата, уже определенной трассировщиком. Существует также немного более продвинутый tracelog()
функция, которая будет представлена в LTTng 2.7.