我最近一直在編寫Apache模塊。使用內存池範例很有意思,但我顯然沒有做正確的事情。我有段錯誤,我似乎無法找到它。我目前的調試周期涉及到ap_rprintfs和一個重建和重新加載Apache的make腳本。如何調試Apache模塊
什麼樣的工具可用於在這種類型的環境中工作?
我最近一直在編寫Apache模塊。使用內存池範例很有意思,但我顯然沒有做正確的事情。我有段錯誤,我似乎無法找到它。我目前的調試周期涉及到ap_rprintfs和一個重建和重新加載Apache的make腳本。如何調試Apache模塊
什麼樣的工具可用於在這種類型的環境中工作?
您應該使用GNU Debugger(gdb)。在gdb中通過命令gdb bin/httpd
和r -X
啓動Apache。發生段錯誤時,您將能夠使用命令bt
查看它發生的位置。
我記錄了我自己使用ddd(gdb前端)Here調試mod_deflate Apache模塊的經驗。該帖子的內容如下:
本指南記錄了調試Apache 2.2.16模塊所需的步驟。本例中正在調試的模塊是deflate模塊(mod_deflate.c)以及用於壓縮數據的zlib庫。在這個例子中,zlib庫和deflate模塊都包含我們希望步入的自定義代碼。
$ EXTRA_CFLAGS = 「 - G」 的./configure前綴=/AP --with-包括-APR --enable-MODS的共享=所有
$使
$ make install
說明: EXTRA_CFLAGS =「 - g」告訴編譯器包含調試符號。 --prefix =/ap將安裝置於/ ap。 --with-included-apr消除了版本或編譯選項與APR和APR-util代碼不匹配的可能性(可能不是必要的,但不會傷害)。 --enable-mods-shared = all允許修改模塊,然後重新加載模塊。如果未使用此選項,則模塊代碼將被編譯爲主要的Apache二進制文件。
確保存在LoadModule模塊deflate_module modules/mod_deflate.so(或類似的東西)。 添加行AddOutputFilterByType DEFLATE text/html text/plain text/xml(或類似的東西)。
$ CFLAGS = 「 - G」 的./configure前綴=倉
在生成文件刪除-03選項,這樣的代碼沒有優化。
$使測試
$ make install的
注: 默認的zlib建立一個靜態庫。 EXTRA_CFLAGS = -g告訴編譯器包含調試符號。 --prefix =/ap將安裝置於bin中。
$/AP /斌/ APXS -I/MYDIR/zlib的/ bin中/有/ -L/MYDIR/zlib的/斌/ lib中/ -c mod_deflate.c -lahaz -g
$ CP的.libs/mod_deflate.so
$ /ap/modules/mod_deflate.so
$/AP /斌/的apachectl -k停止
$/AP /斌/的apachectl -k開始
備註: -g告訴編譯器包含調試符號。
$ DDD/AP /斌/ httpd的
(GDB)R -X
CTRL-C返回gdb提示
文件 - >打開源文件並選擇mod_deflate.c或aha363_zlib.c
以可視方式或通過gdb命令設置斷點。 (gdb)b aha363_zlib.c)
注意:從Apache模塊手冊 - 應用程序開發與Apache pg 328「..我們使用-X選項來防止Apache分離本身, 分叉子,並進入守護進程模式... [Apache]在等待傳入連接時被阻止。所有模塊都已加載,並且配置處於活動狀態。如果我們把它留在那裏,網絡服務器基本上已經啓動並且正在運行,並且將處理傳入請求。我們可以用 Ctrl-c來中斷它以返回到調試器。「
這應該是獲取Apache模塊代碼準備好調試所需的全部內容。