Wie Sie wahrscheinlich bereits wissen, ist CGI, Common Gateway Interface, ein Standardprotokoll für Webserver, um Programme durch die Übergabe von HTTP -Anforderungsdaten über Standardeingabe- und Umgebungsvariablen und die Rückgabe der Standardausgabe des Programms als HTTP -Antwort zu geben. Sofern Fastcgi oder SCGI nicht verwendet werden, wird das ausführbare Programm für jede Anforderung als separater Vorgang vom Webserver gestartet und am Ende abgerissen.
GDB, der GNU -Debugger, wird häufig zum Debuggen von C- und C ++ - Programmen verwendet und unterstützt das Anbringen an laufenden Prozessen. Da der CGI-Prozess nur von kurzer Dauer ist, müssen Sie seinen Ausgang verzögern, um genügend Zeit zu haben, um den Debugger anzubringen, während der Prozess noch ausgeführt wird. Für das ungezwungene Debuggen besteht die einfachste Option darin, sleep() in einer endlosen Schleife am Haltepunktort einfach zu verwenden und die Schleife mit dem Debugger zu verlassen, sobald er dem Programm angeschlossen ist. Es gibt andere, kompliziertere Optionen, die ich hier nicht abdecke.
Das folgende Beispiel setzt Ubuntu Linux und Apache aus.
Installieren und aktivieren Sie zuerst das CGI -Modul:
sudo a2enmod cgi
Konfigurieren Sie dann einen cgi-fähigen virtuellen Host:
<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>
Beachten Sie den TimeOut - Es reserviert 10 Minuten für das Debuggen anstelle des Standards einer Minute. Nach Erreichen der Zeitüberschreitung tötet Apache den CGI -Prozess ab und gibt die 504 -Timeout -Antwort zurück.
Schließlich starten Sie Apache neu:
sudo service apache2 restart
Bauwerkzeuge installieren:
sudo apt-get install build-essentials cmake cgdb
Klon und kompilieren Sie die Anwendung:
git clone https://github.com/mrts/debugging-cgi-applications-with-gdb.git
cd debugging-cgi-applications-with-gdb
cmake .
make
Kopieren Sie die Anwendung in das cgi-bin -Verzeichnis:
cp cgi-debugging-example /var/www/cgi-test/cgi-bin
Öffnen Sie die URL, die die Anwendung im Browser ausführt:
http://cgi-test.example.com/cgi-bin/cgi-debugging-example
Der Browser zeigt das Ladesymbol an, wenn die Anwendung in die endlose Schleife eintritt und jetzt mit GDB angeschlossen werden kann.
Es wird empfohlen, CGDB anstelle von einfachem GDB zu verwenden. CGDB ist ein Flüche Frontend zu GDB, das die bekannte GDB -Textoberfläche mit einem geteilten Bildschirm zur Ausführung der Quelle bietet.
Sie können die CGI -Prozess -ID mit pgrep finden:
pgrep -l cgi-debugging
Befestigen Sie CGDB an den Prozess (der Prozess wird bei der Anhänge von Debugger durchgeführt):
sudo cgdb cgi-debugging-example $(pgrep cgi-debugging)
Als nächstes müssen Sie die Infinite Loop und wait_for_gdb_to_attach() beenden, um den "Haltepunkt" in Ihrer Anwendung zu erreichen. Der Trick hier besteht darin, aus sleep() herauszukommen (), bis Sie wait_for_gdb_to_attach() erreichen und den Wert der Variablen is_waiting mit dem Debugger festlegen, so dass while (is_waiting) beendet:
(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
Sie könnten auch die Rückkehr mit return erzwingen, aber das kann den Anwendungszustand durcheinander bringen und Abstürze verursachen. Oder Sie können next der finish neben den Funktionen aussteigen.
Sobald Sie aus wait_for_gdb_to_attach() nicht mehr sind, können Sie das Programm weiter debuggen oder es bis zur Fertigstellung ausführen lassen:
(gdb) next
(gdb) continue
Continuing.
[Inferior 1 (process 1005) exited normally]
(gdb) quit
Der Browser sollte jetzt die Programmausgabe anzeigen - Hallo!