关于ISAPI调试的文章,网上已经有很多。今天之所以还要写这篇文章,原因有三:一是网上关于调试
ISAPI的方法大多数都是在Win2K;二是网上的例子虽然多,大部分都是转载,大部分作者自己从未亲自试过,就直接把别人的东西粘贴过来,往往影响了
网上搜索又误导了其他寻找答案的人;三是网上的例子有些并不详细,有些也不正确,这样不但不能帮助解决问题,还容易把人带入歧途。
今天得了一点空闲,在这里详细写下ISAPI在Xp环境下的调试方法,希望初次接触到ISAPI的程序员们少一些郁闷。
首先我的操作系统环境是Microsoft Windows Xp Professional。我的编译环境是Virsual C++6.0。VC的补丁主要有SP6。
接下来按照下面的步骤:
1、IIS的目录(根目录、虚拟目录)运行级别改为低(默认为中)
控制面板->管理工具->Internet信息服务。在默认站点上单击右键->属性->主目录(标签)->应用程序保护(N),将中(共用)改为低(IIS进程)。执行权限改为“教本和可执行文件”。
用同样的方法修改你新建的虚拟目录的运行级别。
2、修改本地安全策略属性
控制面板->管理工具->本地安全策略->本地策略->用户权利指派。
a、
找到“以操作系统方式操作”,双击或者右键选属性,弹出对话框后,点“添加用户或组”按钮,在输入文字区域中输入管理员帐户(又称中超级用户),“检查名
称”,“确定”添加。比如我现在登陆的帐号是Guyue,“检查帐号”之后就出现A7B4931A85554A0\Guyue,
A7B4931A85554A0是我的计算机名称,Guyue是当前登陆帐户,是除Administrator之外的我的管理员帐户。“确定”添加。
b、找到“允许计算机和用户帐户被信任以便于委托”,照a的方法添加管理员帐户。
注:这里我没有加用户,直接用的管理员用户。
3、打开VC6.0,不需要打开任何工程。
菜单栏[Build]->[Start Debug]->Attach To Process
勾选“Show System Process”,找到inetinfo,按OK键添加到该进程。
在菜单栏[Project]->[Settings]或者直接按快捷键Alt+F7。
会
看到一个General和一个Debug标签,选择Debug标签。Category下拉列中有两个选项,General和Additional
DLLs,选择Additional DLLs。在Modules中加入你要调试的DLL,勾选Try to locate others
DLLs,按OK确定保存。
4、打开你的ISAPI工程中的一个CPP文件,看能不能设置断点,如果不能,按shift+F5键退出调试状态。进
入下一步。如果退出之后继续[Build]->[Start Debug]->Attach To
Process,这个时候会提示,该工程不包含任何调试信息。如果能设置断点,则直接进入第六步。
注:这一步没有成功,无法attach to process,点了按钮以后process list还是空的。我是用
msdev -p <process ID>生成的一个VC6环境,在运行IE后会在异常抛出位置停止。
5、打开你的ISAPI工程中,确定你的编译状态为Debug状态,确定你Link(输出)的DLL和你在第三步Modules中保存的DLL为同一个文件。Rebuild一下。
6、菜单栏[Build]->[Start Debug]->Attach To Process
勾
选“Show System
Process”,找到inetinfo,按OK键附加到inetinfo进程。打开ISAPI工程中的一个CPP文件,最好是程序的入口文件,在程序的
入口处设置断点,比如我设置的就是CIsapiWtExtension::InitInstance(...)和DWORD
CIsapiWtExtension::HttpExtensionProc(...)程序一旦开始运行,马上就可以在这里截获。
注:既然步骤4里看不到process list,断点设置自然也就不管用了。
7、打开IE,打开你调用该DLL的站点,发出IE请求,VC应该就会在你设置断点的地方拦截到这个请求对当前DLL的操作了。
注:正如我在步骤4中讲到的那样,程序在异常位置会停住,可以看到函数的调用顺序;再就是有个小trick,可以加个ASSERT在异常附近位置,这样程序就可以停止在那儿,这样也就可以使用断点了。
posted on 2008-07-19 18:24
chatler 阅读(799)
评论(0) 编辑 收藏 引用 所属分类:
VC_MFC