程序员都知道,在生产环境中,如果没有系统日志,对问题的分析将非常的困难。即使有日志,有时候也会因为日志记录的不全面,而导致问题不能分析清楚。其实,Windbg里面有Live Debug功能,正好可以借鉴应用。

本文介绍使用Windbg在.net程序中设置断点调试的方法。Windbg在Native Code里面下断点是比较方便的,bp加上一个内存地址就可以做到。下面进入正题。

下面是一段程序,编译运行的程序名为MyApp.exe。

class Program

{

static void Main(string[] args)

{

System.Console.WriteLine("Press any key to be continue...");

Test("Hello");

System.Console.ReadLine();

}

public voidTest(string data)

{

Console.WrilteLine(data);

}

}

加入现在要对Test方法设置断点,查看data参数的情况。步骤如下:

 

步骤一:加载 clr

0:000>.loadby sos clr

 

步骤二:列示Program类型所有方法的信息,并找到 Test方法的MethodTable地址

0:000> !name2ee *!MyApp.Program

Module: 790c2000 (mscorlib.dll)

--------------------------------------

Module: 00a82c3c (MyApp.exe)

Token: 0x02000002

MethodTable: 00a83038

EEClass: 00a811d8

Name: MyApp.Program

 

步骤三:得到了Program类的MethodTable的地址了,获取MethodTable详细信息,找到Test方法的MethodDesc信息。

0:000> !dumpmt -md 00a83038

EEClass: 00a811d8

Module: 00a82c3c

Name: MyApp.Program

mdToken: 02000002 (E:"myProject"MyApp"MyApp"bin"Debug"MyApp.exe)

BaseSize: 0xc

ComponentSize: 0x0

Number of IFaces in IFaceMap: 0

Slots in VTable: 7

--------------------------------------

MethodDesc Table

Entry MethodDesc      JIT Name

79371278   7914b928   PreJIT System.Object.ToString()

7936b3b0   7914b930   PreJIT System.Object.Equals(System.Object)

7936b3d0   7914b948   PreJIT System.Object.GetHashCode()

793624d0   7914b950   PreJIT System.Object.Finalize()

00db0070   00a83020      JIT MyApp.Program.Main(System.String[])

00db0110   00a83028      JIT MyApp.Program.Test

(System.String)

00db00e0   00a83030      JIT MyApp.Program..ctor()

 

步骤四:获取Test方法的执行地址:

0:000> !dumpmd 00a83028    

Method Name: MyApp.Program.ShowParams(Int32, System.String, Char)

Class: 00a811d8

MethodTable: 00a83038

mdToken: 06000002

Module: 00a82c3c

IsJitted: yes

m_CodeOrIL: 00db0110

 

步骤五:增加断点

0:000> bp 00db0110

也可以用BPMD命令在这个方法的MethodDesc上面下断点:

0:000> !bpmd -md 00a83028

MethodDesc = 00a83028

Setting breakpoint: bp 00DB0110 [MyApp.Program.Test(System.String)]

 

步骤六:继续调试

0:000>g

步骤七:单步调试:F10.

步骤八:查看参数信息。运行下面指令,获取到Test方法的的Data参数地址,!do查看即可。

0:000> !clrstack -a

完工!

Windbg断点调试.net程序的更多相关文章

  1. 利用Pycharm断点调试Python程序

    利用Pycharm断点调试Python程序 1.代码 准备没有语法错误的Python程序: #!/usr/bin/pythonimport numpy as np class Network: def ...

  2. Windbg断点调试

    [文章主题] Windbg是Windows驱动调试的重要软件,也是必须学习的软件,前面的博客介绍了一些双机调试的环境配置,只要按照我所说的步骤一步步下来就可以完成环境搭建. 本文主要介绍如何调试sys ...

  3. gdb 断点调试C程序

    最近在看CS50的公开课,视频中david用gdb调试C,我跟着敲,一样的代码但是却显示效果与他不一样.因为他的程序是编译好了的,所以也没看到编译步骤,后来回想一下他make 文件名 显示的代码中有一 ...

  4. 使用 vscode + chrome debuger断点调试 Vue 程序

    总体参考:https://cn.vuejs.org/v2/cookbook/debugging-in-vscode.html 注意点: 1.修改 source-map 2.设置 webRoot 的路径 ...

  5. Visual Studio Code 断点调试Nodejs程序跳过node内部模块(internal modules)

    Built-in core modules of Node.js can be referred to by the ‘magic name’ <node_internals> in a ...

  6. pycharm的断点调试与TODO标记

    断点调试的方法: 断点调试在程序比较大的时候调试运用的比较多 点击Pycharm软件右上角绿色三角形右边的小甲鱼图标,点击之后会弹出断点调试的界面 Debug是用来调试bug的 terminal 是终 ...

  7. WinDbg 调试.net程序

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

  8. WinDBG调试.NET程序示例

    WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...

  9. WinDbg调试.NET程序入门

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

随机推荐

  1. C#和Java的对比

    C#和Java的对比 C#是微软公司在2000年6月发布的一种面向对象的高级程序设计语言:Java是Sun公司在1996年1月发布的一种面向对象的.平台独立的高级程序设计语言.它们是现在最流行的面向对 ...

  2. sql基础语句50条

    curdate() 获取当前日期 年月日 curtime() 获取当前时间 时分秒 sysdate() 获取当前日期+时间 年月日 时分秒 */ order by bonus desc limit ( ...

  3. gsoap生成webservice调用客户端接口

    1.下载gsoap2.8 2.运行 wsdl2h.exe -o XXX.h XXX.wsdl wsdl文件可以是本地文件,也可以是服务器的wsdl,比如http://192.168.0.122:333 ...

  4. python 排序和查找算法

    一.搜索 1.顺序查找 数据存储在具有线性或顺序关系的结构中时,可顺序访问查找 def sequential_search(ilist, item): pos = 0 while pos < l ...

  5. PMP备考-第三章-项目管理过程

    过程:完成预定目标的,一系列相互关联的活动的集合,以便运用一些列工具与技术把特定的输入转化成特定的输出. 五大项目管理过程组:启动-规划-执行-监控-收尾 戴明环(PDCA循环):计划-实施-检查-行 ...

  6. LeeCode——Combine Two Tables

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  7. va_list 、va_start、 va_arg、 va_end 使用说明【转】

    转自:https://blog.csdn.net/f110300641/article/details/83822290 在ANSI C中,这些宏的定义位于stdarg.h中: typedef cha ...

  8. 08webpack-复习

    在调用loader的时候 都是从右往左进行加载的哦 //下面是现在学的webpack的配置文件哦 const path = require("path"); //路径模块 //第2 ...

  9. 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  模块初始: Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相 ...

  10. 201871010107-公海瑜《面向对象程序设计(java)》第6-7周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第6-7周学习总结                项目                                内容 ...