3

我最近一直在写一个 Apache 模块。使用内存池范例很有趣,但我显然没有做正确的事情。我有一个段错误,我似乎找不到它。我当前的调试周期涉及 ap_rprintfs 和一个重建和重新加载 Apache 的 make 脚本。

什么样的工具可用于在这种类型的环境中工作?

4

2 回答 2

5

您应该使用 GNU 调试器 (gdb)。gdb bin/httpd通过命令而不是r -X在 gdb 中启动 Apache 。当 segfault 发生时,您将能够使用 command 查看它发生的位置bt

于 2009-12-26T13:35:43.010 回答
2

我在此处记录了自己使用 ddd(gdb 前端)调试 mod_deflate Apache 模块的经验。该帖子的内容如下:


本指南记录了调试 Apache 2.2.16 模块所需的步骤。本例中调试的模块是 deflate 模块 (mod_deflate.c) 以及用于压缩数据的 zlib 库。在此示例中,zlib 库和 deflate 模块都包含我们希望逐步执行的自定义代码。

  1. 下载并编译 Apache 源代码分发。还要确保您的系统上尚未安装 Apache。您可以从这里下载 Apache 源代码。

$ EXTRA_CFLAGS="-g" ./configure --prefix=/ap --with-included-apr --enable-mods-shared=all

$ 制作

$ 进行安装

注意: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 --prefix=bin

在 Makefile 中删除 -03 选项,以便不优化代码。

$ 进行测试

$ 进行安装

注意:默认情况下 zlib 构建一个静态库。EXTRA_CFLAGS=-g 告诉编译器包含调试符号。--prefix=/ap 将安装放在 bin 中。

  1. 编译并安装 mod_deflate。

$ /ap/bin/apxs -I/mydir/zlib/bin/include/ -L/mydir/zlib/bin/lib/ -c mod_deflate.c -lahaz -g

$ cp .libs/mod_deflate.so

$ /ap/modules/mod_deflate.so

$ /ap/bin/apachectl -k 停止

$ /ap/bin/apachectl -k 开始

注意: -g 告诉编译器包含调试符号。

  1. 开始调试

$ddd /ap/bin/httpd

(gdb) r -X

ctrl-c 返回 gdb 提示符

File->Open Source 并选择 mod_deflate.c 或 aha363_zlib.c

可视化设置断点或通过 gdb 命令(即 (gdb) b aha363_zlib.c )

注意:来自 The Apache Modules Book – Application Development with Apache pg 328 “.. 我们使用 -X 选项来防止 Apache 分离自身、派生子节点和进入守护程序模式…… [Apache] 在等待传入连接时被阻塞。所有模块均已加载,并且配置处于活动状态。如果我们把它留在那里,网络服务器基本上已经启动并运行,将为传入的请求提供服务。我们可以使用 Ctrl-c 中断它以返回调试器。”</p>

这应该是准备好调试 Apache 模块代码所需的全部内容。

于 2011-11-19T08:28:31.423 回答