2009-12-26 68 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模块代码准备好调试所需的全部内容。