用WinDbg探索CLR世界[1] - 安装与环境配置

2024-03-15 18:48

本文主要是介绍用WinDbg探索CLR世界[1] - 安装与环境配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用WinDbg探索CLR世界[1] - 安装与环境配置

用WinDbg探索CLR世界[1] - 安装与环境配置

[url]http://www.blogcn.com/user8/flier_lu/index.html?id=1270368&run=.0D9CAA6[/url]

    一直以来,我对CLR的分析都是基于MSDN、.NET Framework SDK自带文档和Rotor项目提供的源代码进行静态分析,辅以自己写的一些小例子或对Rotor的修修补补,来进行有限度的动态分析。虽然也用SoftIce跟踪过某些核心函数的机制,但感觉实在是太痛苦了,呵呵。
    最近偶然之间发现我的偶像John Robbins在MSDN的BugSlayer上发表的一篇文章<SOS: It's Not Just an ABBA Song Anymore>,才发现原来用WinDbg可以如此方便的动态分析CLR的运行机制。

    首先,需要下载并安装 Microsoft Debugging Tools [/url]。最好还能下载并安装当前操作系统相应的Windows Symbol Packages。
    然后,配置系统环境变量,让搜索路径指向系统.NET Framework的安装目录,既sos.dll所在目录

    set PATH=%PATH%;E:/WINDOWS/Microsoft.NET/Framework/v1.1.4322

    启动WinDbg之后,在File/Symbol Search Path选项中加入符号文件的安装目录,如

    E:/WINDOWS/Symbols;E:/VS2003/SDK/v1.1/symbols

    或者设置系统环境变量_NT_SYMBOL_PATH(需要重起WinDbg)

    set _NT_SYMBOL_PATH=E:/WINDOWS/Symbols;E:/VS2003/SDK/v1.1/symbols

    最后,在File菜单中,用Open Executable打开一个CLR程序或者用Attach to a process附加到一个正在运行的CLR程序上。

    配置好WinDbg之后,如果打开一个新可执行程序,WinDbg会自动断点到入口,则继续运行再Break;如附加到进程则直接Break。
    然后在最下方命令行上输入系统命令 .load sos 命令载入外部扩展sos.dll。如果配置系统路径正确则这里不会有任何反应,可以继续用系统命令 .chain 查看当前载入的扩展。如下显示则表示sos.dll成功载入。

以下为引用:

0:005> .chain
Extension DLL search Path:
    E:/MS/PlatformSDK/Debugging Tools/winext;...;E:/WINDOWS/Microsoft.NET/Framework/v1.1.4322
Extension DLL chain:
    sos: API 1.0.0, built Fri Feb 21 10:47:40 2003
        [path: E:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/sos.dll]
    dbghelp: image 6.3.0005.1, API 6.0.6, built Fri Oct 24 02:11:02 2003
        [path: E:/MS/PlatformSDK/Debugging Tools/dbghelp.dll]
    ext: image 6.3.0005.1, API 1.0.0, built Fri Oct 24 09:06:45 2003
        [path: E:/MS/PlatformSDK/Debugging Tools/winext/ext.dll]
    exts: image 6.3.0005.1, API 1.0.0, built Fri Oct 24 02:10:39 2003
        [path: E:/MS/PlatformSDK/Debugging Tools/WINXP/exts.dll]
    uext: image 6.3.0005.1, API 1.0.0, built Fri Oct 24 02:10:54 2003
        [path: E:/MS/PlatformSDK/Debugging Tools/winext/uext.dll]
    ntsdexts: image 6.0.4044.0, API 1.0.0, built Wed Oct 22 02:13:21 2003
        [path: E:/MS/PlatformSDK/Debugging Tools/WINXP/ntsdexts.dll]




    在载入sos.dll之后,可以用 lm 命令看看当前有哪些模块被载入内存,如

以下为引用:

0:005> lm
start    end        module name
...
77f30000 77ffa000   ntdll        (export symbols)       E:/WINDOWS/system32/ntdll.dll
79000000 79010000   ConfigWizards     (deferred)
79040000 79085000   fusion       (deferred)
79170000 79196000   mscoree      (deferred)
791b0000 79412000   mscorwks     (deferred)
...




    对希望进行分析的模块,可以用ld命令载入相应的调试符号文件(如果有的话,呵呵)。
    如果符号文件搜索路径配置正确的话,可以看到提示

以下为引用:

0:005> ld mscorjit
Symbols loaded for MSCORJIT




    此时再用lm可以看到

以下为引用:

...
79430000 7947c000   MSCORJIT     (pdb symbols)          E:/VS2003/SDK/v1.1/symbols/mscorjit.pdb
...




    如果符号文件搜索路径配置错误,或者此模块没有调试符号文件,则会载入.dll的export表

以下为引用:

79170000 79196000   mscoree      (export symbols)       E:/WINDOWS/system32/mscoree.dll




    或者干脆没有符号

以下为引用:

79780000 79980000   mscorlib     (no symbols)




    完成以上的配置之后,就可以正式开始用WinDbg探索CLR的内部世界了,你可以敲个!SyncBlk,呵呵。

以下为引用:

0:005> !SyncBlk
Index SyncBlock MonitorHeld Recursion   Thread  ThreadID     Object Waiting
-----------------------------
Total           3
ComCallWrapper  0
ComPlusWrapper  0
ComClassFactory 0
Free            0




    这不就是昨天分析的lock锁定中的那几个计数器吗 :P

to be continue...
最新版windbg下载
[url]http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.6.03.5.exe[/url]
 

这篇关于用WinDbg探索CLR世界[1] - 安装与环境配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812928

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方