代码之家  ›  专栏  ›  技术社区  ›  Willi Ballenthin

如何调试Apache模块

  •  3
  • Willi Ballenthin  · 技术社区  · 16 年前

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

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

    2 回复  |  直到 16 年前
        1
  •  5
  •   Marko Kevac    16 年前

    gdb bin/httpd 及 r -X 在gdb内部。当segfault发生时,您将能够通过命令查看它发生的位置 bt .

        2
  •  2
  •   Community Mohan Dere    6 年前

    我记录了自己使用ddd(gdb前端)调试mod_deflate Apache模块的经验 Here


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

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

    $EXTRA_CFLAGS=“-g”。/configure--prefix=/ap--包括apr--enable mods shared=all

    $make安装

    EXTRA_CFLAGS=“-g”告诉编译器包含调试符号。 --prefix=/ap将安装放置在/ap中。 --随附的apr消除了版本或编译选项与apr和apr util代码不匹配的可能性(可能不是必需的,但不会造成伤害)。 --enable mods shared=all允许修改模块,然后重新加载。如果未使用此选项,则将模块代码编译到主Apache二进制文件中。

    1. 在/ap/config/httpd.conf更新Apache配置文件。

    确保存在LoadModule deflate_modules modules/mod_deflate.so(或类似内容)行。 添加行AddOutputFilterByType DEFLATE text/html text/plain text/xml(或类似内容)。

    1. 编译zlib库(在本例中使用默认编译标志)。

    $CFLAGS=“-g”。/configure--prefix=bin

    在Makefile中删除-03选项,这样代码就不会被优化。

    $make测试

    笔记: 默认情况下,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. 开始调试

    (gdb)r-X

    ctrl-c返回到gdb提示符

    文件->开源并选择mod_deflate.c或aha363_zlib.c

    注意:来自Apache模块手册《使用Apache pg 328开发应用程序》。。我们使用-X选项来防止Apache自行分离, 配置处于活动状态。如果我们把它留在那里,Web服务器基本上已经启动并运行,将为传入的请求提供服务。我们可以用英语打断它 Ctrl-c返回调试器。

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

    推荐文章