dnSpy调试部署在IIS上的程序集代码(DLL文件)方法

首先我们知道我们的调试目标方法位于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

 

posted @ 2022-05-10 14:36  Chr☆s  阅读(892)  评论(0编辑  收藏  举报