Как вы, вероятно, уже знаете, CGI, общий интерфейс шлюза, является стандартным протоколом для веб -серверов для выполнения программ путем передачи данных HTTP -запроса в программу через стандартные переменные ввода и среды, а также возвращая стандартный вывод программы в качестве ответа HTTP. Если не используется FastCGI или SCGI, выполняемая программа запускается как отдельный процесс веб -сервером для каждого запроса и разорванной в конце.
GDB, отладчик GNU, обычно используется для отладки программ C и C ++ и поддерживает прикрепление к запуску процессов. Поскольку процесс CGI недолговечен, вам необходимо отложить его выход, чтобы иметь достаточно времени, чтобы прикрепить отладчика, пока процесс еще работает. Для случайной отладки самая простой вариант - просто использовать sleep() в бесконечном цикле в месте останова и выйти из петли с отладчиком, как только он будет прикреплен к программе. Есть и другие, более сложные варианты, которые я здесь не освещаю.
В следующем примере предполагается, что Ubuntu Linux и Apache.
Сначала установите и включите модуль CGI:
sudo a2enmod cgi
Затем настройте виртуальный хост с поддержкой CGI:
<VirtualHost *:80>
ServerName cgi-test.example.com
DocumentRoot /var/www/cgi-test/htdocs
CustomLog /var/log/apache2/cgi-test.access.log combined
ErrorLog /var/log/apache2/cgi-test.error.log
TimeOut 600
ScriptAlias /cgi-bin/ /var/www/cgi-test/cgi-bin/
<Directory "/var/www/cgi-test/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Обратите внимание на параметр TimeOut - он оставляет 10 минут для отладки вместо по умолчанию одну минуту. После достижения тайм -аута Apache убивает процесс CGI и возвращает отклик тайм -аута 504 .
Наконец, перезапустить Apache:
sudo service apache2 restart
Установите инструменты сборки:
sudo apt-get install build-essentials cmake cgdb
Клонировать и составить приложение:
git clone https://github.com/mrts/debugging-cgi-applications-with-gdb.git
cd debugging-cgi-applications-with-gdb
cmake .
make
Скопируйте приложение в каталог cgi-bin :
cp cgi-debugging-example /var/www/cgi-test/cgi-bin
Откройте URL, который запускает приложение в браузере:
http://cgi-test.example.com/cgi-bin/cgi-debugging-example
Браузер покажет значок загрузки, когда приложение входит в бесконечный цикл и теперь может быть прикреплен к GDB.
Рекомендуется использовать CGDB вместо простого GDB. CGDB - это фронт CRSES для GDB, который обеспечивает знакомый текстовый интерфейс GDB с разделенным экраном, показывающим источник при выполнении.
Вы можете найти идентификатор процесса CGI с pgrep :
pgrep -l cgi-debugging
Прикрепите CGDB к процессу (процесс приостановлен при прикреплении отладчика):
sudo cgdb cgi-debugging-example $(pgrep cgi-debugging)
Затем вам нужно выйти из функции Infinite Loop и wait_for_gdb_to_attach() , чтобы достичь «точки останова» в вашем приложении. Хитрость здесь состоит в том, чтобы выйти из sleep() , пока вы не достигнете wait_for_gdb_to_attach() и установить значение переменной is_waiting с отладчиком, чтобы в то while (is_waiting) выходит:
(gdb) finish
Run till exit from 0x8a0920 __nanosleep_nocancel () at syscall-template.S:81
0x8a07d4 in __sleep (seconds=0) at sleep.c:137
(gdb) finish
Run till exit from 0x8a07d4 in __sleep (seconds=0) at sleep.c:137
wait_for_gdb_to_attach () at cgi-debugging-example.c:6
Value returned is $1 = 0
(gdb) set is_waiting = 0 # <- to exit while
(gdb) finish
Run till exit from wait_for_gdb_to_attach () cgi-debugging-example.c:6
main () at cgi-debugging-example.c:13
Вы также можете заставить возврат с return , но это может испортить состояние заявки и вызвать сбои. Или вы можете использовать next , чтобы выйти из функций вместо finish .
После того, как вы выйдете из wait_for_gdb_to_attach() , вы можете продолжить отладку программы или оставить ее до завершения:
(gdb) next
(gdb) continue
Continuing.
[Inferior 1 (process 1005) exited normally]
(gdb) quit
Браузер теперь должен показать вывод программы - Привет!