我最近一直在编写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模块代码准备好调试所需的全部内容。