您的位置:首页 > 运维架构 > Apache

用QT Creator部署,运行及断点调试Apache的C/C++模块

2015-10-27 00:00 567 查看
摘要: (C/C++开发Apache模块系列 第二章)创建Apache模块工程,及用QT Creator编译的方法已经在上一篇文章中介绍了。本文进一步说明如何用QT Creator部署,运行及断点调试Apache模块。重点说明断点调试。本章是开发环境搭建方法介绍的最后一章。本章结束后,后面的章节将会从HelloWorld说起,逐步结合实质的业务来说明Apache模块开发。

一 概述

本文所说的所有的部署,运行及断点调试这些操作都是在本地机器上进行的。而写出来的模块往往是部署并运行在远程的服务器上。所以这里说的都是开发环境的设置,至于测试环境及产生环境,本文内容并不涉及。(开发环境、生产环境、测试环境 的说明:http://my.oschina.net/sancuo/blog/214904)。本文关于断点调试的内容,大家可以看看了如下的文章:

http://httpd.apache.org/dev/debugging.html

《Apache Debugging Guide》

这实质上是Apache官网上的文章。说的就是Apache服务器的调试方法。阅读上面这个文章需要注意一个细微的差异:官网上的文说的是整个Apache服务器(Apache server)的调试方法,而本文所关注的是 Apache模块的调试方法。具体来说,官文调试整体,需要用“-g”选项重新编译整个Apache服务器;本文调试部分,“-g”选项只需要新编译指定的模块即可。(“-g”选项是gcc用于向目标文件加入调试信息的选项)

二 需求描述

2.1 参看上一章《QT Creator 加 apxs 搭建Apache模块开发环境》的第二小节。

本文的环境,需要在上一章的环境基础上再进行添加。所以上一章中所生成的工程可以直接拿来用。

2.2 安装 Command Line Tools

打开终端输入:

xcode-select --install


2.3 安装 gdb

本来Xcode自带gdb,但后来Xcode的debuger改用lldb所以就没有了gdb了。需要自己安装。下面的网文有安装方法:

http://www.csdn123.com/html/topnews201408/43/8443.htm

该文涉及brew的安装,其方法如下:

curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1

三 具体方法

3.1 用“-g”选项重新编新编译模块

使用“-g”选项主要是为了模块带上调试信息。我们只需要使指定模块是debug版的就可以实现断点调试了。换言之无需整个Apache服务器都是debug版。如果是在命令行中,编译debug版模块的方法是:cd 进工程根目录然后输入如下命令

make CFLAGS=-g all

即可编译出带调试信息的模块。实质上CFLAGS是apxs内部使用到的一个编译变量,这里直接将其设置成“-g”了。如果查一下CFLAGS在
apxs
中的设置信息可以用以下命令:

apxs -q CFLAGS

在我的机器上,用上面命令查出CFLAGS的内容为空。所以我直接就把编译命令写成“make CFLAGS=-g all”。

而要QT Creator编译出带调试信息的模块方法也很简单,看下面截图就可以知道具体的方法(留意左侧纵向工具条“项目”)



一些建议:这里的构建设置,最好分为debug及release两个版本,以方使日后使用。具体新增设置的方法很简单不冗述。release版的构建设置用

make all

即可。后面所述的部署,运行等设置,我都推荐大家分为debug及release两个版本。

3.2 模块的部署

在命令行上实现的部署分标准的步骤分两步。一是设置httpd.conf,二是运行 make install。这两个操作都会遇到权限问题。为了开发方便,这里介绍的部署方法会和标准有点不一样。这些不一样的地方主要是为了不用老是sudo输密码。

第一步,设置httpd.conf。httpd.conf是Apache的配置文件,我们需要对其进行配置Apache才会在启动时加载我们的模块。在Mac上httpd.conf通常的路径如
为:/etc/apache2/httpd.conf
。该文件对于普通用户来说是没有写权限的,所以我作了一个变通。在终端执行如下命令:

touch /Users/apple/work/global/apache_test_setting.conf
sudo su
echo "Include /Users/apple/work/global/apache_test_setting.conf">>/etc/apache2/httpd.conf

上面的命令是在httpd.conf末尾追加一包含语句。被包含的是apache_test_setting.conf这个文件。这个文件是普通用户可读写的。好了我们现在要向apache_test_setting.conf加入具体的设置信息了:

LoadModule helloapache_module /Users/apple/work/project/helloapache/mod_helloapache.so
<Location "/helloapache">
Sethandler helloapache
</Location>

其中“/Users/apple/work/project/helloapache”是我开发代码的工程根目录。第一个设置语句的意思是:启动时加载工程根目录下的mod_helloapache.so文件。或者有人会问:
通常Apache模块都是放在Modules目录或libexec目录中,你为什么要放在自己的开发目录中呢?这主要是为了在make clean时方便删除。因为调试的模块多起来时会使Modules目录或libexec目录
很零乱,时间一长那些so文件是要删的,那些是不能删的你都搞不清。这个应该在一开始就做好设置,避免日后麻烦。另外,这第一步的设置,无需修改QT Creator.


第二步。修改
Makefile中下面的脚本

install: install-modules-yes

我们需要把这一句改成如下这样

install: install-modules-yes
mv /usr/libexec/apache2/mod_helloapache.so ./

然后,在工程根目录运行


sudo make install

路径“/usr/libexec/apache2/”是的的机器上,默认的Apache模块安装目录。这里的修改主要是把so库从默认的安装目录中放回工程根目录(该操作是要sudo的)。

第二步,在QT Creator上的设置需要QT Creator获取root权限才能实现。要不然在移动文件时会失败。下面介绍一个以root权限启动QT Creator的方法,看下面shell脚本:

$ cd /Applications/Qt\ Creator.app/Contents/MacOS/
$ sudo su
# ./Qt\ Creator

该方法在单步调试时,会再次用到。原因是Apache是以root权限启动的。如果QT Creator是普通权限的话,想调试root权限的Apache根本就权限不足。QT Creator上的设置用截图说明:



是的就设置一个“make install”就OK了。上面这些是release版的部署设置。而debug版的部署设置与release版的基本一样,只是最后要加多一步“dSYM”生成的步骤。dSYM 常见于Mac的开发环境中(例如:Xcode)是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中。apxs默认情况下并不会为我们生成该文件。我们需要自己生成,在Makefile中加入下面的脚本

debug_info:
dsymutil ./mod_helloapache.so

这个主要用于生成“dSYM”文件,其名为“mod_helloapache.so.dSYM”。在终端执行的部署命令为:

sudo make install debug_info

debug版的部署,在QT Creator中的设置方法与release版的方法基本一样,只是命令变成了“make install debug_info”。

3.3 release版模块的运行

在终端中运行release模块的命令如下:

sudo make start

关闭命令

sudo make stop

重启命令

sudo make stop

在QT Creator中的设置为:



3.4 debug版模块的运行

debug版的运行,与release版的很不一样。

3.4.1 要确认上面提及的“dSYM”文件已经生成了.

如果没有该文件就会生如下图的“Cannot access memory at address 0xe40”问题:



3.4.2 在工程根目录编写.gdbinit文件

该文件会在gdb启动时读入并运行中当的命令。.gdbinit的具体内容如下

#文件名: .gdbinit
#gdb启动时会读取当前目录下的该文件,并运行其中的命令
r -X

"r -X"的作用以参看《Apache Debugging Guide》一文中的说明。

3.4.3 终端调试运行模块

所用的命令如下:

sudo gdb httpd

要注意:等命令输出稳定后,输入"Ctrl+c"才能设置断点。

3.4.4 QT Creator调试运行模块

先要设置QT Creator的调试器为gdb(默认为:lldb),用"command+,"打开设置界面,参照下面截图进行设置:



接首要设置工程运行的程序:



如上图,这回设置的不是make了。

请保证以root权限启动QT Creator,点击debug按钮即可调试。当然,我们要向Apache发送请求才会进入我们的断点。发送请求的方法很多,有人直接用浏览器,而我这里用的是比较简单的curl:

curl localhost/helloapache

到这里我们就可以单步调试了。截图如下:



小结:

本系列文章,关于环境搭建及设置的内容到此结束。下一章将会从一个类似于HelloWorld的程序说起。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: