1. Windbg调试.net托管代码需要借助于SOS.dll,.Net 4.0的32位sos.dll的路径在C:\Windows\Microsoft.NET\Framework\v4.0.30319,64为的路径在C:\Windows\Microsoft.NET\Framework64\v4.0.30319,加载哪个版本的sos.dll要与调试的应用程序的位数一致。关于SOS调试扩展的详细介绍请参考:https://msdn.microsoft.com/zh-cn/library/bb190764(v=vs.100).aspx
  2. Windbg的可以通过Open Executable直接在windbg中启动程序调试,也可以通过Attach to a process attach到一个已经启动的进程进行调试,本例使用Open Executable方式调试程序
  3. 示例代码
    static void Main(string[] args)
    {
    System.IO.FileSystemInfo fileSystemPath = GetFileSystemPath();
    if (!fileSystemPath.Exists)
    {
    throw new System.IO.FileNotFoundException(fileSystemPath.FullName);
    } Console.ReadLine();
    }
    private static FileSystemInfo GetFileSystemPath()
    {
    FileInfo fileInfo = new FileInfo(@"x:\Dev\TempLibrary.mdb"); return fileInfo;
    }
  4. 在Windbg中选择Open Executable打开应用程序,
  5. 如何在某个函数中设置断点:
    • Open Executable的调试方法首先要执行sxe ld:clrjit命令,该命令的作用是表示当程序加载完clrjit.dll后中断到调试器,即在调试器中中断运行
    • 执行g命令,运行程序,当程序加载完clrjit.dll时就会中断
    • 执行.loadby sos clr命令加载扩展信息
    • 执行lm命令查看加载的所有模块,lmvm可以查看某个模块的详细信息,本例中执行lmvm Console1

    • 执行!Name2EE <模块名> <类型名或方法名> 命令获取模块中指定类型或方法的MethodTable结构和EEClass结构,本例中获取Program类的信息

    • 调用DumpMT –md <MethodTable地址>获取类中方法信息,本例中methodtable地址由name2ee命令获取

    • 执行!bpmd <模块名> <方法名>设置断点,本例中执行!bpmd Console1 Console1.Program.GetFileSystemPath

    • 执行命令g,运行到断点就会停止
  6. 如何查看变量信息:
    • !clrstack -a命令显示托管函数的参数和局部变量信息

    • !dumpheap –type 类型:显示堆中某类型变量的地址信息,然后使用!dumpobj address显示变量信息
  7. 如何分析内存泄露:
    • 执行!dumpheap命令可以打印出当前所有类型所占内存空间的大小

Windbg调试托管代码的更多相关文章

  1. windbg调试托管代码 .Net clr

    现在很多的程序都是多语言混合编程的,比如我司的产品,就是用C++/.net clr混合编制的.那么当我们调试这样的程序时,一定要注意,比如有时我们只看到c++的栈和名称,而.net clr的代码确看不 ...

  2. WinDbg 调试.net程序

    WinDbg支持以下三种类型的命令: ·        常规命令,用来调试进程 ·        点命令,用来控制调试器 ·        扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...

  3. 使用Windows Debugger调试托管代码----引用自官方帮助文档

    以下文字引用在Windbg的帮助文档.觉得对初次调试托管代码,非常有用,故粘贴至此. ========================================================= ...

  4. WinDBG 调试命令大全

    转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html  #调试命令窗口 ++++++++++++++++++++++++ ...

  5. 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

    调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...

  6. 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置

    调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

  7. 开源项目asmjit——调用自定义方法demo以及windbg调试

    asmjit是一个开源项目,使用它可以将代码即时的编译成机器码,也就是所谓的jit技术. 初次接触这个项目,编写了一个demo,学习它的使用方法. 现将编写的demo以及调试jit生成的机器码的过程总 ...

  8. WinDbg调试.NET程序入门

    俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...

  9. 用WinDbg调试Windows和驱动程序

    由于本人能力有限,翻译不足之处敬请谅解,欢迎批评指正:sunylat@163.com MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/h ...

随机推荐

  1. 27.Qt时钟

    myclock.h #ifndef MYCLOCK_H #define MYCLOCK_H #include <QObject> #include <QLCDNumber> # ...

  2. .NET MVC Dropzone 上传图片

    在nuget控制台输入:Install-Package dropzone @{ Layout = null; } <!DOCTYPE html> <html> <head ...

  3. 互联网智能门锁,手机蓝牙APP成为首选

    随着互联网门锁在行业中的普及,大家越加关注到门锁的实施和维护成本.我们在互联网智能门锁的调研中发现,网关联网的智能门锁,使用时需要依赖房间内的宽带上网线路,而断线后客户反馈问题较多.据某家分散式公寓的 ...

  4. JEE Spring-boot 简单的ioc写法。

    什么是ioc,就是你可能会有一些生活必需品,这些东西你必须要用才能存活.但是你不是每天都回去买,去哪一家点去买.而这些用品会一直放在哪里,每一个商店就是一个容器,包裹着这些物品. 创建ioc项目,首先 ...

  5. SQL Server-聚焦使用索引和查询执行计划

    前言 上一篇我们讲了聚集索引对非聚集索引的影响,对数据库一直在强调的性能优化,所以这一节我们统筹讲讲利用索引来看看查询执行计划是怎样的,简短的内容,深入的理解,Always to review the ...

  6. 阿里logo库

    http://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.2

  7. Pyhton学习——Day30

    # 内核态# 用户态# 操作系统的运行是在BOIS启动盘读取代码,从硬盘读取到内存中,被操作系统的内核中,一直存在在内存中# 计算机系统的三层结构:应用软件-->操作系统-->硬件# 一般 ...

  8. 使用json_decode无法解析json

    在接入合作方接口时,遇到一个json无法解析出来代码如下: <?php $res='{"resultcode":007,"resMsg":"!& ...

  9. 2017CCPC秦皇岛

    热身赛 B题 Smartphone: 大整数相乘 Time Limit: 1 Second Memory Limit: 65536 KBHelianthuswolf Co. Ltd. is a mul ...

  10. python 递归算阶乘 (转载)

    Python 递归函数 递归函数在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 ...