Попробую написать утилитку, которая бы отслеживала путь выполнения программы, не так подробно как ltrace, но все же существенно более быстро.
А так же попробую воспользоваться функциями.
1 Напишу функцию, которая аналогична indent, но с собственным алгоритмом формирования смещения:
function local_depth() {
ind = ""
for (i=depth[tid()];i>=0;i--){
ind = sprintf("%s|", ind)
}
ind = ind . ">"
return ind
}
Результат выполения функции - это строка отступа для текущего потока с учетом глубины вложенности. Т.е сведения о глубине хранятся в массиве depth с ключем tid(), т.е идентификатором текущего потока. Результат примерно выглядит так |||>
или |||||||>
Задача для проба: написать пробы которые бы отслеживали посланный от процесса к процессу сигнал в CentOS 7, вывод обеспечит в двух строках: 1 - кто послал кому послал и какой сигнал, 2 - кто принял. И вывод бактрейса хендлера принявшего сигнал.
Первым делом я посетил вот этот перечень готовых функций: https://sourceware.org/systemtap/tapsets/signal.stp.html
Он содержит все необходимы для реализации программы функции: signal.send
+ и signal.handle
+
Учитывая, что необходимо один раз выводить информацию и о посылавшем процессе и о принимающем, то сохраним при посылке данные в массив. Вот тут я и наткнулся на необычное для меня поведение программы, отсутствие поддержки локалных массивов. Это очень неудобно. Второй момент, что-то я не нашел варианта кроме embedded C, прописать структуру, а так как в массив нужно сохранять разнородные данные, для простоты читабельности кода, пришлось для каждого параметра делать отдельный массив.
Я сразу приведу список статей на которые опирался, при проведении дальнейших экпериментов:
Список макроопределений systemtap:
Название | Описание |
---|---|
$$vars | Expands to a character string that is equivalent to sprintf("parm1=%x ... parmN=%x var1=%x ... varN=%x", parm1, ..., parmN, var1, ..., varN) for each variable in scope at the probe point. Some values may be printed as “=?” if their run-time location cannot be found. |
$$locals | Expands to a subset of $$vars containing only the local variables. |
$$parms | Expands to a subset of $$vars containing only the function parameters. |
$$return | Is available in return probes only. It expands to a string that is equivalent to sprintf("return=%x", $return) if the probed function has a return value, or else an empty string |
Продолжу...
rr - легковесная утилитка для записи и проигрывания выполняющегося процесса. Ооочень полезна при отладке, хотя и имеет ряд ограничений.
С ее помощью весьма неплохо записывался php процесс, с чилдами и родителем. А вот MySQL записаться не смог.
Не буду перенабирать примеры использования утилиты...
Это больше руководство для самого себя по теме systemtap, я это средство отладки недавно обнаружил и решил задокументировать все, что по нему узнал. Поэтапно и постепенно, какие примеры разбирал. Эти меморизы должны будут побороть мой склероз и пригодиться мне в дальнейшем использовании этого мощного средства.
И так, что такое systemtap?
SystemTap — это средство, которое позволяет собирать и анализировать информацию о работающей Linux системе. В отличие от встроенных средств, таких как netstat, ps, top, SystemTap был разработан с целью предоставить больше возможностей для сбора и представления информации.
SystemTap представляет из себя интерфейс командной строки и скриптовый язык программирования.
Системные администраторы могут использовать SystemTap для мониторинга и анализа производительности системы, а разработчики программного обеспечения могут использовать SystemTap для анализа поведения приложения в работающей системе.
В разработке проекта SystemTap участвуют такие компании как Red Hat, IBM, Oracle Corporation, Hitachi.