.NET应用程序调试—原理、工具、方法(4)
2.3.调试系统的基本流程及架构(.NETDAC概念、mscordacwks.dll)
有一个很重要的原理我觉得很有必要讲一下,就是.NETDAC概念。
其实.NETDAC也就是.NET Data Access .NET数据访问层,这个是专门用来提供给SOS.DLL\SOSEXDLL或者其他调试扩展包使用的,所有的调试扩展组件必须通过这个DAC才能访问到.NET运行时的数据,所以在初次使用SOS的时候会经常碰见加载错误的mscordacwks.dll文件,此文件就是DAC的物理文件。
这个文件和SOS扩展文件一样,都有这不同的版本,当加载不同类型的.NET程序时会使用到不同版本的mscordacwks.dll文件,当然大部分情况下此文件时自动加载的,只有出现你分析的文件与生成调试文件的环境不一致时才会出现头疼的问题。
图5:(mscordacwks.dll位置)
当你知道这个组件是工作于此位置时,当出现跟它相关的错误提示时你就不需要担心了,无非就是文件加载的位置或者版本不匹配而已。
调试器会话、调试器注入线程
还有一点我觉得也很有必要介绍的就是有关调试器如何调试.NET程序的,当我们在使用调试器启动被调试程序或者将调试器附加到被调试进程时,其实调试器会注入一些线程到.NET程序中,让调试线程与.NET程序原本的线程在一个.NET执行环境中,这样的目的是能够起到最.NET程序在执行时的控制,比如中断执行,设置断点。当我们需要执行某些跟线程上下文相关的扩展命令时就需要切换到正确的线程上去。
图6:(调试器注入线程)
此时,调试器使用一个注入线程将.NET程序在执行时中断,原理就是通过发送线程中断命令来达到控制目标线程,那么首先要能够与原线程通讯才行,所以需要注入托管线程。(注意:注入的线程不一定就是托管.NET线程,严重它最好的方法就是查看所有所有的进程内线程和所有托管线程,对比一下就知道了。),其实这个ID为3的线程是调试器会话线程。
图7:(切换到原托管线程)
我们通过~0s命令切换到我们需要调试的原托管线程中,比如,在执行!ClrStack命令时,就需要切换到当前线程上执行。
我们需要验证它是否是注入了托管线程还是非托管线程。
图8:(托管线程列表)
相关新闻>>
- 发表评论
-
- 最新评论 更多>>