前置知识
当执行windows可执行文件时,OS会创建一个线程,叫做初始线程,应用程序的主函数都是在这个线程里面执行的。
但是对于托管程序来说,在托管程序初始化期间,.Net运行时还会自动创建两个工作线程,一个是系统创建的初始化线程,另外两个是.Net运行时创建的工作线程,一个是与内存回收相关的终结器线程,另外一个是支持调试的辅助调试进程。
托管调试模型
托管程序的调试一共有三种:
- 使用非托管调试器调试程序中的非托管代码。
我们知道Net程序一共有三部分组成,第一个是非托管代码和数据,第二个是托管代码和数据,第三个是支持托管调试的运行时控制器[CRThread]。对于调试程序也分为三部分:本地代码调试器,托管调试器,托管API。
因为托管代码最终也是要编译为本地代码,所以利用这个调试模式可以调试本地代码也是调试托管代码。但是需要使用特定插件才可查看托管代码的数据结构
- 使用托管调试器调试托管代码
托管调试器通过调试器API和被调试进程运行时控制器通信来访问要调试的托管代码和数据。这种模式不会跟踪本地代码。
- 混合调试
速度慢
联系纽带
RCThread作为调试器与被调试程序通讯的纽带。当我们使用~*命令
打印被调试进程所有线程的时候,发现第二个(1号线程)是RcThread,任何利用~ 1n命令
挂起该线程,然后再利用VS调试,发现VS失去响应调试失败。
刺探线程、
当调试器右端需要访问托管程序资源时候,首先需要先获取这些资源的保护锁,如果这个保护锁是由托管程序普通线程拥有的,那么将导致死锁,所以RcThread会创建一个新县城用于帮助Rcthread刺探信息