找回密码
 注册
搜索
查看: 5698|回复: 0

[收藏]如何在IIS中调试ISAPI和COM组件

[复制链接]
发表于 2005-8-15 19:04:39 | 显示全部楼层 |阅读模式
  记得这个问题出现过很多次,也有不少朋友抱怨一直没有人能给出实际点的答案,好了,今天终于有空把它写下来,答案就在这里,希望能对各位有帮助。8 D4 K. v" b$ t% J% F  _0 T

; ~- ?1 s  J- ^0 T主要的内容见微软的网站:http://support.microsoft.com/support/kb/articles/Q183/4/80.ASP* T" E/ Z  H, B/ W& f' e3 \# |
我在这里加了一点自己的见解。
# i) b2 W4 L; v' X0 u; b2 N7 \
3 J) K0 Q- u- _首先介绍一点IIS的相关知识,IIS是微软操作系统中的一个服务,它是以操作系统级别权限运行这个服务的,以win2k为例,运行设置->控制面板->管理工具->IIS信息服务,查看其属性,在主目录下面你可以找到应用程序保护一项,有IIS进程,共用的,独立的三项,默认的选项是共用进程。IIS进程指的是ISAPI DLL和COM组件以进程内组件(DLL)的形式运行在IIS这个进程里,这样的结果是运行的速度最快,因为IIS可以直接和DLL、组件交互,但是这样的风险也最大,一旦因为组件(DLL)的设计原因造成系统出错,连带的也会造成IIS进程的崩溃,导致IIS服务中止。. U9 T8 j3 V2 r" a. R: l* M

& I5 J* ?2 b. R7 a: l当使用共用进程的时候,系统会启动一个叫做dllhost.exe的进程,把组件(DLL)挂到这个进程中运行,这样,即使因为组件(DLL)的原因导致系统出错时,只能够导致DLLHOST这个进程出错,并不会破坏IIS的核心进程,当发生这样的错误时,IIS用一系列的手段将dllhost进程出错信息返回给客户端,IIS自身继续正常运行。这种方式的运行速度比上一种慢一些,在windows nt中,系统以mtx.exe替代dllhost。
* M7 F, o0 r3 s4 p; R
* o" l/ a% I8 y- t' r6 `我并没有使用过以独立的进程启动应用程序,不过可以想象,系统会以独立进程的方式启动组件,这样的可靠性最高,但是速度最慢,因为IIS要经过一系列的marshal和unmarshal(列集和散集,可见潘爱民COM原理与应用一书)才能把数据传递给这个独立进程。
8 ^# c! |/ S5 V8 f  Z% d
& E& K4 S( r! T这么罗嗦的原因是,有一些旧的debug方法,如VC技术内幕中卡拉斯基给出的关于调试ISAPI的办法,好些人一直没成功,原因在于所给出的方法针对的是以IIS进程方式调试,而IIS的默认方式是共用进程,我没有在IIS进程中调试过,推荐你也不必使用这种方式。( O( h: T* g) a  u8 K
/ S2 [: d6 W3 d! I, f% A
就以共用进程的方式调试我们的组件和ISAPI吧,以WIN2K,VC++6为例,这里是详细的操作步骤:
" W& R( S3 N( E! I- Y$ ^( a5 T0 \3 q3 {; r$ ?$ ~9 x1 M! @
1.确信你的IIS服务已经启动,并且你的ISAPI和COM组件已经通过编译,放在了恰当的位置,比如,ISAPI在正确的虚拟目录,COM组件已经过注册等等。
& {! G3 H' i! C" _6 N6 w) `: d
, A2 l0 p$ W% H( M8 ]3 B2.打开你的project,选择Build菜单下的Start Debug->Attach Process.- F1 U; b( l0 h( W

3 g7 ^( h$ M+ |) \' ?: d/ x3.出现进程列表,选择Show System Processes(显示系统进程)
; l/ ]: ~2 ]2 I0 w- {; T' \* ^' `
9 l; v" {0 E7 E% d6 p9 A2 N4.选择dllhost.exe进程(如果你的IIS是以共用方式启动应用程序的话),如果是在WINDOWS NT或者其它的版本,那就选择mtx.exe。# d5 o: j! l; t' R+ ~2 V/ f* Z
) q9 {1 `4 P& i3 G+ F" |1 W
5.这时候系统载入dllhost的资源了,选择project->Settings->Debug,选择Category(类别)->Additional Dlls,这时候加入我们写好的ISAPI DLL或COM组件(就是xxxx.dll)
$ s+ p0 X6 Z* y2 P, S; g0 G4 N; o0 X3 |7 i4 p; G- A5 q7 z; i6 U
6.你可以看到OutPut窗口输出一行字,表明组件的资源已经加载。
/ u: M3 h7 \1 k0 u4 _: n+ u
8 {* K1 _4 A1 {+ ]  _+ Y# |7.打开需要调试的源文件,在恰当位置加入断点。如果届时不能正确在该处中断,可能是你的PDB文件与DLL文件的版本不一致,那就需要重新编译了。( ]$ i# H$ E# s, S" D

3 x4 U7 N) X3 @" Z  B6 E8.这时候,你就打开浏览器,键入相关网址,然后,你就等待着你的程序被激活吧!
4 Q4 m6 F" o4 x. }+ I& h" U) [: v9 Y5 V4 v, u
有很长的一段时间,我也在一直尝试着在IIS中调试程序,当程序在那一刹那间跳入断点时,内心是多么的兴奋啊,马上试试吧,我可以保证这个方法是正确的,如果还有问题,可以来信和我联系,呵呵,吃饭去啦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-6-18 12:21 , Processed in 0.018537 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表