2009-12-26 81 views
3

我最近一直在編寫Apache模塊。使用內存池範例很有意思,但我顯然沒有做正確的事情。我有段錯誤,我似乎無法找到它。我目前的調試周期涉及到ap_rprintfs和一個重建和重新加載Apache的make腳本。如何調試Apache模塊

什麼樣的工具可用於在這種類型的環境中工作?

回答

5

您應該使用GNU Debugger(gdb)。在gdb中通過命令gdb bin/httpdr -X啓動Apache。發生段錯誤時,您將能夠使用命令bt查看它發生的位置。

1

我記錄了我自己使用ddd(gdb前端)Here調試mod_deflate Apache模塊的經驗。該帖子的內容如下:


本指南記錄了調試Apache 2.2.16模塊所需的步驟。本例中正在調試的模塊是deflate模塊(mod_deflate.c)以及用於壓縮數據的zlib庫。在這個例子中,zlib庫和deflate模塊都包含我們希望步入的自定義代碼。

  1. 下載並編譯Apache源碼分發。還要確保你的系統上沒有安裝Apache。您可以從這裏下載Apache源代碼。

$ 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二進制文件。

  1. 更新/ap/config/httpd.conf中的Apache配置文件。

確保存在LoadModule模塊deflate_module modules/mod_deflate.so(或類似的東西)。 添加行AddOutputFilterByType DEFLATE text/html text/plain text/xml(或類似的東西)。

  1. 編譯zlib庫(在這種情況下使用默認編譯標誌)。

$ CFLAGS = 「 - G」 的./configure前綴=倉

在生成文件刪除-03選項,這樣的代碼沒有優化。

$使測試

$ make install的

注: 默認的zlib建立一個靜態庫。 EXTRA_CFLAGS = -g告訴編譯器包含調試符號。 --prefix =/ap將安裝置於bin中。

  1. 編譯並安裝mod_deflate。

$/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模塊代碼準備好調試所需的全部內容。