<格蠹汇编>_第9章_趣谈托管程序的辅助调试线程

前置知识

         当执行windows可执行文件时,OS会创建一个线程,叫做初始线程,应用程序的主函数都是在这个线程里面执行的。

         但是对于托管程序来说,在托管程序初始化期间,.Net运行时还会自动创建两个工作线程,一个是系统创建的初始化线程,另外两个是.Net运行时创建的工作线程,一个是与内存回收相关的终结器线程,另外一个是支持调试的辅助调试进程

托管调试模型

         托管程序的调试一共有三种:

  • 使用非托管调试器调试程序中的非托管代码。

         我们知道Net程序一共有三部分组成,第一个是非托管代码和数据,第二个是托管代码和数据,第三个是支持托管调试的运行时控制器[CRThread]。对于调试程序也分为三部分:本地代码调试器,托管调试器,托管API。

         因为托管代码最终也是要编译为本地代码,所以利用这个调试模式可以调试本地代码也是调试托管代码。但是需要使用特定插件才可查看托管代码的数据结构

  • 使用托管调试器调试托管代码

         托管调试器通过调试器API和被调试进程运行时控制器通信来访问要调试的托管代码和数据。这种模式不会跟踪本地代码。

  • 混合调试

         速度慢

联系纽带

         RCThread作为调试器与被调试程序通讯的纽带。当我们使用~*命令打印被调试进程所有线程的时候,发现第二个(1号线程)是RcThread,任何利用~ 1n命令挂起该线程,然后再利用VS调试,发现VS失去响应调试失败。

刺探线程、

         当调试器右端需要访问托管程序资源时候,首先需要先获取这些资源的保护锁,如果这个保护锁是由托管程序普通线程拥有的,那么将导致死锁,所以RcThread会创建一个新县城用于帮助Rcthread刺探信息