Пусть необходимо отладить процесс, запускаемый из другого процесса и быстро завершающийся.
Пример: нужно отладить расширение PHP, PHP настроен как cgi, т.е процесс запускается при появлении запроса и быстро завершается.
В отладке поможет systemtap.
memleax отлаживает и находит утечки памяти без перезагрузки сервиса или процесса и без перекомпилляции.
Установка:
wget http://download.opensuse.org/repositories/home:/bayrepo/CentOS_7/home:bayrepo.repo -O /etc/yum.repos.d/home:bayrepo.repo
yum install memleax -y
Детали описания: http://bayre...
В этой статье не планирую ставить никакого задания. Просто буду собирать полезные сценарии из интернета и возможно - описывать свои. А так же вставлю ссылки на полезные статьи по исследованию и описанию работы некоторых функций glibc, для дальнейшей возможности обследования их через systemtap.
Сценарий 1
Интересный скрипт, позволяющий остановить выполнение программы в нужном месте и запустить gdb
Попробую написать утилитку, которая бы отслеживала путь выполнения программы, не так подробно как 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, прописать структуру, а так как в массив нужно сохранять разнородные данные, для простоты читабельности кода, пришлось для каждого параметра делать отдельный массив.