【发布时间】:2010-12-30 01:55:37
【问题描述】:
我最近一直在编写一个 Apache 模块。使用内存池范例很有趣,但我显然没有做对。我有一个段错误,我似乎找不到它。我当前的调试周期涉及 ap_rprintfs 和一个重建和重新加载 Apache 的 make 脚本。
有哪些工具可用于在此类环境中工作?
【问题讨论】:
标签: c apache debugging apache2-module
我最近一直在编写一个 Apache 模块。使用内存池范例很有趣,但我显然没有做对。我有一个段错误,我似乎找不到它。我当前的调试周期涉及 ap_rprintfs 和一个重建和重新加载 Apache 的 make 脚本。
有哪些工具可用于在此类环境中工作?
【问题讨论】:
标签: c apache debugging apache2-module
您应该使用 GNU 调试器 (gdb)。通过命令gdb bin/httpd 和 gdb 中的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 --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 返回调试器。”
这就是准备调试 Apache 模块代码所需的全部内容。
【讨论】: