如何调试Apache模块

时间:2009-12-26 05:53:26

标签: c apache debugging apache2-module

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

在这种环境中可以使用哪种工具?

2 个答案:

答案 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模块都包含我们希望逐步完成的自定义代码。

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

    $ 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二进制文件。

    1. 在/ap/config/httpd.conf更新Apache配置文件。
    2. 确保存在LoadModule deflate_module modules / mod_deflate.so(或类似内容)行。 添加行AddOutputFilterByType DEFLATE text / html text / plain text / xml(或类似的东西)。

      1. 编译zlib库(在这种情况下使用默认的编译标志)。
      2.   

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

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

          

        $ make test

             

        $ make install

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

        1. 编译并安装mod_deflate。
        2.   

          $ / 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告诉编译器包含调试符号。

          1. 开始调试
          2.   

            $ 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模块代码所需的全部内容。