zoukankan      html  css  js  c++  java
  • 用WinDbg探索CLR世界[1] 安装与环境配置

    一直以来,我对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,呵呵。
  • 相关阅读:
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    449. Serialize and Deserialize BST
    114. Flatten Binary Tree to Linked List
    199. Binary Tree Right Side View
    173. Binary Search Tree Iterator
    98. Validate Binary Search Tree
    965. Univalued Binary Tree
    589. N-ary Tree Preorder Traversal
    eclipse设置总结
  • 原文地址:https://www.cnblogs.com/holly/p/1408277.html
Copyright © 2011-2022 走看看