我最近一直在写一个 Apache 模块。使用内存池范例很有趣,但我显然没有做正确的事情。我有一个段错误,我似乎找不到它。我当前的调试周期涉及 ap_rprintfs 和一个重建和重新加载 Apache 的 make 脚本。
什么样的工具可用于在这种类型的环境中工作?
我最近一直在写一个 Apache 模块。使用内存池范例很有趣,但我显然没有做正确的事情。我有一个段错误,我似乎找不到它。我当前的调试周期涉及 ap_rprintfs 和一个重建和重新加载 Apache 的 make 脚本。
什么样的工具可用于在这种类型的环境中工作?
您应该使用 GNU 调试器 (gdb)。gdb bin/httpd
通过命令而不是r -X
在 gdb 中启动 Apache 。当 segfault 发生时,您将能够使用 command 查看它发生的位置bt
。
我在此处记录了自己使用 ddd(gdb 前端)调试 mod_deflate Apache 模块的经验。该帖子的内容如下:
本指南记录了调试 Apache 2.2.16 模块所需的步骤。本例中调试的模块是 deflate 模块 (mod_deflate.c) 以及用于压缩数据的 zlib 库。在此示例中,zlib 库和 deflate 模块都包含我们希望逐步执行的自定义代码。
$ 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 二进制文件中。
确保存在 LoadModule deflate_module modules/mod_deflate.so (或类似的东西)行。添加行 AddOutputFilterByType DEFLATE text/html text/plain text/xml (或类似的东西)。
$ CFLAGS="-g" ./configure --prefix=bin
在 Makefile 中删除 -03 选项,以便不优化代码。
$ 进行测试
$ 进行安装
注意:默认情况下 zlib 构建一个静态库。EXTRA_CFLAGS=-g 告诉编译器包含调试符号。--prefix=/ap 将安装放在 bin 中。
$ /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 告诉编译器包含调试符号。
$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 模块代码所需的全部内容。