Seperti yang mungkin sudah Anda ketahui, CGI, Common Gateway Interface, adalah protokol standar untuk server web untuk menjalankan program dengan meneruskan data permintaan HTTP ke dalam program melalui input standar dan variabel lingkungan, dan mengembalikan output standar program sebagai respons HTTP. Kecuali FastCGI atau SCGI digunakan, program yang dapat dieksekusi dimulai sebagai proses terpisah oleh server web untuk setiap permintaan dan diruntuhkan pada akhirnya.
GDB, Debugger GNU, biasanya digunakan untuk men -debug program C dan C ++ dan mendukung melampirkan proses menjalankan. Karena proses CGI berumur pendek, Anda perlu menunda keluarnya untuk memiliki cukup waktu untuk melampirkan debugger saat prosesnya masih berjalan. Untuk debugging kasual opsi termudah adalah dengan hanya menggunakan sleep() dalam lingkaran tanpa akhir di lokasi breakpoint dan keluar dari loop dengan debugger setelah dilampirkan pada program. Ada opsi lain yang lebih rumit yang tidak saya liput di sini.
Contoh berikut mengasumsikan Ubuntu Linux dan Apache.
Instal pertama dan aktifkan modul CGI:
sudo a2enmod cgi
Kemudian konfigurasikan host virtual yang diaktifkan 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>
Catatan parameter TimeOut - cadangan 10 menit untuk debugging, bukan default satu menit. Setelah timeout tercapai, Apache membunuh proses CGI dan mengembalikan respons timeout gateway 504 .
Akhirnya, restart Apache:
sudo service apache2 restart
Instal Build Tools:
sudo apt-get install build-essentials cmake cgdb
Klon dan kompilasi aplikasi:
git clone https://github.com/mrts/debugging-cgi-applications-with-gdb.git
cd debugging-cgi-applications-with-gdb
cmake .
make
Salin aplikasi ke direktori cgi-bin :
cp cgi-debugging-example /var/www/cgi-test/cgi-bin
Buka URL yang menjalankan aplikasi di browser:
http://cgi-test.example.com/cgi-bin/cgi-debugging-example
Browser akan menampilkan ikon pemuatan saat aplikasi memasuki loop tanpa akhir dan sekarang dapat dilampirkan dengan GDB.
Dianjurkan untuk menggunakan CGDB sebagai ganti GDB biasa. CGDB adalah frontend kutukan ke GDB yang menyediakan antarmuka teks GDB yang akrab dengan layar split yang menunjukkan sumber saat dijalankan.
Anda dapat menemukan ID Proses CGI dengan pgrep :
pgrep -l cgi-debugging
Lampirkan CGDB ke proses (prosesnya dijeda saat debugger melekat):
sudo cgdb cgi-debugging-example $(pgrep cgi-debugging)
Selanjutnya Anda perlu keluar dari fungsi Infinite Loop dan wait_for_gdb_to_attach() untuk mencapai "breakpoint" di aplikasi Anda. Kuncinya di sini adalah untuk keluar dari sleep() sampai Anda mencapai wait_for_gdb_to_attach() dan mengatur nilai variabel is_waiting dengan debugger sehingga while (is_waiting) keluar:
(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
Anda juga bisa memaksa kembali dengan return , tetapi itu mungkin mengacaukan keadaan aplikasi dan menyebabkan kerusakan. Atau Anda bisa menggunakan next untuk keluar dari fungsi alih -alih finish .
Setelah Anda keluar dari wait_for_gdb_to_attach() , Anda dapat melanjutkan men -debug program atau membiarkannya dijalankan ke penyelesaian:
(gdb) next
(gdb) continue
Continuing.
[Inferior 1 (process 1005) exited normally]
(gdb) quit
Browser sekarang harus menunjukkan output program - halo!