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。
(1)先启动Apache服务器,通过命令行方式如下
path D:\Apache22\bin #设置环境变量
httpd –k install #安装
httpd –k start #启动
(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浏览器地址栏中输入” ”,如果前面的步骤都正确,这时程序会在你设置断点的地方停下来(第一次时间比较长,系统需要加载一些调试信息)。这时你就可以跟随断点轻松了解Apache是如何处理http请求消息,进而了解Apache的内核及工作原理。
阅读(1218) | 评论(0) | 转发(0) |