Chr☆s Kwok 的技术笔记

.NET, C#, WPF, WCF, WF, .NetCore & LINQ ... I know how it works because I know why it works ...

博客园 首页 新随笔 订阅 管理

首先我们要知道我们的调试目标方法位于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):
image(图1)

image(图2)

图3(图3)

但是我们发现好多站点都配置在JetsunAppPool上(见图4):
图4
(图4)

这样不便于我们在dnSpy附加准确的进程ID。可以在命令窗口查询一下:

CD C:\windows\system32\inetsrv
appcmd list wp 输出IIS所有站点及站点下挂载的应用程序(见图5):
image(图5)

所以只能将站点PhysicalExamService配置在新建的一个应用程序池PisAppPool(参考原来的JetsunAppPool)(见图6)
image(图6)

我们再用命令appcmd list wp查询一下(见图7):我们发现该应用程序池有超过一个工作进程,所以还是无法用dnSpy准确的附加唯一的进程ID来打开中间层代码设置断点:
image(图7)

之所以超过一个工作进程是应用程序池“最大工作进程数”设置了大于1(见图8),需要暂时(为了调试)修改为1。调试完毕再恢复原来设置值
image(图8)

调整完毕,客户端使用到该服务就由唯一一个工作进程提供,查询一下,对应的进程ID为20300(见图9)
image(图9)

启动DNSPY.EXE,附加进程(见图10),注意应用程序池的“启用32位应用程序”属性设置(见图11),DNSPY.EXE为64位就要将PisAppPool应用程序池的该属性设置为False,否则刷新不出来
图10
(图10)

image(图11)

选择页签“模块”-筛选进程20300(图12)。点击列“时间戳”倒序,找到我们要调试的DLL文件(图13)
图12
(图12)

图13(图13)

注意:如果看不到[模块]页签,需要点击菜单[调试]->[窗口]->[模块]将其打开,如图14:
图14(图14)

  • IIS 应用池未处理任何请求,看不到自己的业务DLL文件
    NET 应用(尤其是 ASP.NET Core)只有在首次收到 HTTP 请求后才会加载业务 DLL。若应用池刚启动但未被访问,模块列表中只会看到 mscorlib.dll、System.Private.CoreLib.dll 等基础库,‌看不到你自己的业务 MyAppServiceLibrary.dll‌。

可以先再IIS站点浏览一下SVC文件:譬如:http://localhost/InfectService/Infect.Svc就会加载业务DLL

补充说明:
DLL 实际路径‌:IIS 加载的 DLL 通常位于临时 ASP.NET 文件夹,例如:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\*\*\assembly\dl3\*\*.dll
[譬如]:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\infectservice\3a904440\9e97adba\assembly\dl3\69ff6f5c\0077edf8_cabcdc01\*.dll
不是你的项目发布目录

双击PhysicalExam.ServiceLibrary.dll此行,dnSpy自动加载打开该程序集,定位到类PhysicalRegisterSvc(见图15)
图15
(图15)

找到要调试的方法,设置断点(见图16):
图16
(图16)

前端程序调用该方法时就能停在该断点上了(见图17):
图17
(图17)

posted on 2026-05-13 16:21  Chr☆s  阅读(75)  评论(0)    收藏  举报