我最近一直在写一个Apache模块。使用内存池范例很有意思,但我显然没有做正确的事情。我有一个段错误,我似乎无法找到它。我当前的调试周期涉及ap_rprintfs和一个重建和重新加载Apache的make脚本。
在这种环境中可以使用哪种工具?
答案 0 :(得分:5)
您应该使用GNU调试器(gdb)。通过命令gdb bin/httpd
和gdb中的r -X
启动Apache。发生segfault时,您将能够通过命令bt
查看它发生的位置。
答案 1 :(得分:1)
我记录了自己使用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
$ make
$ 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 --prefix = bin
在Makefile中删除-03选项,以便不优化代码。
$ make test
$ make install
注意: 默认情况下,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 stop
$ / ap / bin / apachectl -k start
注意: -g告诉编译器包含调试符号。
$ ddd / ap / bin / httpd
(gdb)r -X
ctrl-c返回gdb提示
文件 - >开源并选择mod_deflate.c或aha363_zlib.c
直观地或通过gdb命令设置断点(即(gdb)b aha363_zlib.c)
注意:来自Apache Modules Book - 使用Apache pg 328进行应用程序开发“..我们使用-X选项来防止Apache自行分离, 分叉子,并进入守护进程模式... [Apache]在等待传入连接时被阻止。所有模块都已加载,并且 配置是活动的。如果我们将它留在那里,网络服务器基本上已启动并运行,并将为传入的请求提供服务。我们可以打断它 Ctrl-c返回调试器。“
这应该是准备好调试Apache模块代码所需的全部内容。