首先我们知道我们的调试目标方法位于IIS的某个应用网站(见图1),该网站的WS服务由其配置的应用程序池(图2)启用工作进程(可能有多个,后面会说到原因)承载。譬如调试方法在:
E:\Program Files\JetSun\Applications\PhysicalExamService\bin\PhysicalExam.ServiceLibrary.dll文件的方法public bool UpdateIsWebExportReport(ClientContext context, Dbs dbs, IList<DtoPhysicalRegister> dtos) (见图3)
图1
图2
图3
但是我们发现好多网站都配置在JetsunAppPool上(见图4)
图4
这样不便于我们在dnSpy附加准确的进程ID。可以在命令窗口查询一下:
CD C:\windows\system32\inetsrv
appcmd list wp 输出IIS所有站点及站点下挂载的应用程序(见图5):
图5
所以只能将网站PhysicalExamService配置在新建的一个应用程序池PisAppPool(参考原来的JetsunAppPool)(见图6)
图6
我们再用命令appcmd list wp查询一下(见图7):我们发现该应用程序池有超过一个工作进程,所以还是无法用dnSpy准确的附加唯一的进程ID来打开中间层代码设置断点。
图7
之所以超过一个工作进程是应用程序池“最大工作进程数”设置了大于1(见图8),需要暂时(为了调试)修改为1。调试完毕再恢复原来设置值。
图8
调整完毕,客户端使用到该服务就由唯一一个工作进程提供,查询一下,对应的进程ID为20300(见图9)
图9
启动DNSPY.EXE,附加进程(见图10),注意应用程序池的“启用32位应用程序”属性设置(见图11),DNSPY.EXE为64位就要将PisAppPool应用程序池的该属性设置为False,否则刷新不出来
图10
图11
选择页签“模块”-筛选进程20300(图12)。点击列“时间戳”倒序,找到我们要调试的DLL文件(图13)
图12
图13
双击PhysicalExam.ServiceLibrary.dll此行,dnSpy自动加载打开该程序集,定位到类PhysicalRegisterSvc(见图14):
图14
找到要调试的方法,设置断点(见图15):
图15
前端程序调用该方法时就能停在该断点上了(见图16):
图16