Apache源码编译调试


2011-02-26 10:26
Apache Server源代码的调试跟普通程序不太一样,因为它不是一个直接可以从IDE环境运行的独立程序。笔者最先也是感觉无从下手,网上这方面的资料很少,我也是经过摸索才得以解决,这里写出来希望对研究Apache源代码的朋友有所帮助。
Apache Server的源代码量很大(几十万行),读起来很是费劲。但是如果能够在源代码级动态调试把代码跟踪一遍,采用这样的方式阅读源代码必将事半功倍。
要声明的是:如果想要在Windows环境下在源代码级别进行跟踪调试,首先必须将源代码编译通过。笔者是通过Visual Studio.net2003编译通过的,Apache的版本为2.2.4,下载名为httpd-2.2.4-win32-src,可以在Apache的官方网站上下载到。

要在Visual Studio.net下将Apache编译通过也并非易事,这里不讲这个。我们假定你已经通过Visual Studio.net将Apache编译通过并且以Debug方式安装到本地计算机上,并假设你的安装根目录为D:\Apache22。

apache编译的步骤:

Visual C++ 97.0 (.net)的用户还应该使用Build 菜单下的Configuration Manager对话框来不选中模块abs, mod_ssl, mod_deflate and all the apr_dbd_* projects 对编译DebugRelease版本都是。 仅当srclib目录下至少存在openssl或者zlib子目录二者之一, 才能调用nmake或者明白地使用BinBuild目标直接从集成开发环境来编译这几个模块。

其余的网上教程很多就啰嗦了!

至于出现的错误,多编译两次就OK了

(1)先启动Apache服务器,通过命令行方式如下
path D:\Apache22\bin       #设置环境变量
httpd –k install             #安装

httpd –k start             #启动

在启动的时候出现错误:


这个在debug状态有,release就没有了,直接【忽略】几次就可以启动了!

(2)启动Visual Studio.net IDE环境,并设置断点
启动vs.net环境,打开Apache解决方案。找到你确定执行一个http请求一定要执行的代码(笔者自己写一个处理模块。如果你没有自己的写的模块,只想阅读源代码,建议打开工程中的libhttpd模块的mpm_winnt文件夹下的child.c,在L775的处理http连接的函数 ap_process_connection 调用处设置一个断点,所有的http请求都会经过这里。
(3)找到你要调式的Apache进程
Apache在windows环境下运行时有一个父进程和一个子进程。打开任务管理器,可以看到进程列表中有两个名为”httpd.exe”的进程,可以通过其线程数的多少来区分父子进程。默认情况下是无法看到进程所拥有的线程数。你可以通过任务管理器的查看->选择列菜单打开如下所示:
将线程计数项勾上,然后确定就可以看到进程的线程数。其中线程数多(大约254左右)的就是子进程。
(4)将源代码与进程关联
选择vs.net的调试->进程菜单,打开如下进程对话框:
注意选中下面的”显示系统进程”,然后选中子进程,单击右边的”附加”按钮,打开如下:
如图选中Common Language Runtime和Native两项,然后确定,并关闭进程对话框。这是你会发现vs.net已经处理调试状态。
(5)触发调试
    在IE浏览器地址栏中输入”  http://localhost/”,如果前面的步骤都正确,这时程序会在你设置断点的地方停下来(第一次时间比较长,系统需要加载一些调试信息)。这时你就可以跟随断点轻松了解Apache是如何处理http请求消息,进而了解Apache的内核及工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值