Пусть необходимо отладить процесс, запускаемый из другого процесса и быстро завершающийся.

Пример: нужно отладить расширение PHP, PHP настроен как cgi, т.е процесс запускается при появлении запроса и быстро завершается.

В отладке поможет systemtap.

Первое, необходимо написать такой небольшой probe(php.stp):

#! /usr/bin/env stap

probe process("/opt/myphp/usr/lib64/php/modules/mymodule.so").function("check_func") {
    printf("Send SIGSTOP\n")
    raise(%{ SIGSTOP %})
}

probe begin {
    printf("Waiting for even or Ctrl+C\n")
}

Где /opt/myphp/usr/lib64/php/modules/mymodule.so - это путь к расширению, и check_func - это функция, которую нужно отладить. Проверить видимость для systemtap это функции можно командой: stap -L 'process("/opt/myphp/usr/lib64/php/modules/mymodule.so").function("check_func")' или в общем виде stap -L 'process("/opt/myphp/usr/lib64/php/modules/mymodule.so").function("*")' | grep check_func.

Все необходимые debug пакеты должны быть установлены.

Теперь запускаем stap: stap -g php.stp. Обязательно в режиме guru - -g. И вызываем скрипт посредством браузера, curl, wget, lynx и т.д.

Далее ищем php процесс в статусе T:

[~]# ps aux | grep php
root      3006  0.0  0.0 254628  3284 pts/8    S+   19:11   0:00 curl -v test.test/eval.php
user0   3008  0.1  0.3 230480 14236 ?        T    19:11   0:00 /opt/myphp/usr/bin/php-cgi

Присоединяемся к нему с помощью gdb gdb /opt/myphp/usr/bin/php-cgi --pid=3008

И выполняем такие команды:

gdb>b check_func
gdb>signal SIGCONT
gdb>n

Т.е. ставим точку остановки, можно сразу несколько и посылаем сигнал продолжения выполения программы.

Все, можно отлаживать.

Добавить комментарий

Blog Comments powered by Disqus.

Предыдущая запись