介绍

1. 什么是Windbg

  • WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
  • WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。
  • Dump文件是进程的内存镜像, 可以把程序的执行状态通过调试器保存到dump文件中

2. Windbg可以解决以下问题

◆ 内存高

◆ CPU高

◆ 程序异常

◆ 程序Hang死

3. 使用windbg进行调试分析的两种方式

  • 使用windbg调试器attach到需要调试的进程。(会暂停进程的运行)
  • 抓取进程的dump文件,使用windbg分析dump

一.准备

1.下载

官网地址:
https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit

选择对应的工具包下载

2.安装

  1. 下载之后点击安装,可选择安装的工具,我们只选择windbg就可以。安装之后在debuggers文件夹下选择32位或64位程序运行

  1. 打开windbg之后,需要设置symbol path,可以按快捷键Ctrl+S。把下面的路径粘贴进去保存。系统进行dump解析等操作的时候会自动下载需要的符号表

    srvc:\symcachehttp://msdl.microsoft.com/download/symbols;c:\symcache;

3.抓取dump

1. 通过procdump获取

下载地址:https://technet.microsoft.com/en-us/sysinternals/dd996900

下载之后为压缩包,将文件解压。通过dos命令来生成dump文件。下面为一条语句为示例

procdump -ma -c 0 -s 3 -n 2 sqlservr.exe -o E:\dumps\

这条语句的意思为:当sqkservr.exe这个进程运行时间cpu的占用超过0%,时间超过3秒,则在E:\dumps下生成一个dump文件。一直到生成2个为止。下面为命令介绍

  • -ma 生成full dump, 即包括进程的所有内存. 默认的dump格式包括线程和句柄信息.
  • -c 在CPU使用率到达这个阀值的时候, 生成dump文件.
  • -s CPU阀值必须持续多少秒才抓取dump文件.
  • -n 在该工具退出之前要抓取多少个dump文件.
  • -o dump文件保存目录.
  • Sqlservr.exe可替换为进程的ID

下图为运行示例(sqlserver等操作需要cmd以管理员权限打开)

2. 任务管理器抓取

可在任务管理器进程右键进程,点击创建转储文件,系统会自动抓取和保存,保存完成会弹出对话框提示保存路径

二.解析

1.解析dump文件

通过windbg的菜单,File—>Open Crash Dump选择dump文件打开。打开成功界面如下图所示:

2.命令

1.基本命令

  • ? 获取命令提示
  • D 查看内存信息
  • K 观察栈
  • ~ 显示和控制线程 ~number s number为线程id 如:~1s为获取1号线程的上下文
  • Q 退出
  • !runaway 查看线程占用cpu时间,可看出哪个线程占用时间最高(所有线程)
  • .dump /ma E:/dumps/myapp.dmp 抓取dump

2.元命令

  • .help 获取命令提示
  • .cls 清屏
  • .ttime 查看线程占用cpu时间,可看出哪个线程占用时间最高(当前线程)

3..扩展命令

  • . chain 获取命令集列表。在已经加载的动态链接库中。
  • .load/.unload 加载/卸载命令模块
  • **!模块名.help **查看某个扩展库中包含的扩展命令

4..Net程序相关命令

基本

  • !peb或!dlls 列出进程已经加载的dll
  • **!threadpool ** 查看当前CPU状况 线程数等等
  • !dumpheap –stat 统计堆信息
  • !Threads 所有托管线程 -special Crl创建的线程
  • !clrstack 看看这个线程再干嘛 执行那些方法
  • !clrstack –p addr addr:具体方法的参数值地址
  • !do 地址 查看参数值
  • !analyze –v 显示分析的详细信息
  • .reload /i /f 强制重新加载pdb

内存调试

  • **!eeheap –gc ** 获取gc中内存信息
  • !eeheap –loader Loader 堆信息
  • !dumpheap –stat 统计GC堆的信息,统计GC堆上存活的对象
  • !dumpheap -mt < 查看该地址上的对象
  • !gcroot <<对象地址>> 查看对象根
  • **!dumpheap -type <<System.String >> ** 查看string类型在堆中的信息
  • !helproot -查看gcroot的帮助

在解析.Net程序时首先要加载运行环境framework版本对应的SOS.DLL

.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.DLL

这里只是写一些比较常用的命令,想要详细了解更多命令了以到官网查看

3.高内存占用示例

【读取文件代码】

【在代码执行过程中抓取dump文件打开,并加载sos.dll】


【运行!dumpheap –stat获取最高内存占用的地址】

【!gcroot address获取调用函数】

最终,我们找到了高内存的调用入口!

当然如果gc堆上的占用内存较高的对象是自定义的类,那么就可以直接查看相关的调用函数来分析可能的问题了

用Windbg来分析.Net程序的dump的更多相关文章

  1. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

  2. 使用Windbg调试.Net应用程序 [转]

    Windbg+Procdump解决w3wp.exe CPU过百问题[转] High CPU Dump收集工具 - ProcDump使用方法[转] ProcDump v9.0[官方] windbg查找c ...

  3. WinDbg调试分析 net站点 CPU100%问题

    WinDbg调试分析 asp.net站点 CPU100%问题 公司为了节省成本,最近有一批服务器降了配置,CPU从8核降到了2核.本身是小站点,访问量也不高,CPU总是会飙到100%而且可以一直持续几 ...

  4. 在Eclipse中使用MAT分析Android程序内存使用状况(转)

    对于Android这种手持设备来说,通常不会带有太大的内存,而且一般用户都是长时间不重启手机,所以编写程序的时候必须要非常小心的使用内存,尽量避免有内存泄露的问题出现.通常分析程序中潜在内存泄露的问题 ...

  5. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  6. Net Memory Profiler 分析.Net程序内存泄露

    Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...

  7. 使用CLR Profiler分析.NET程序

    使用CLR Profiler分析.NET程序 就像剥去.NET语法糖衣的工具(Reflector等)很多一样,我们可以用来分析.NET程序性能的工具有很多,如前面一片博文DebugLZQ给大家介绍的v ...

  8. 老李案例分享:MAT分析应用程序服务出现内存溢出过程

    老李案例分享:MAT分析应用程序服务出现内存溢出过程   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...

  9. windows用户态程序的Dump

    熟悉Linux的开发人员都知道,在Linux下开发程序,如果程序崩溃了,可以通过配置Core Dump,来让程序崩溃的瞬间产生一个Dump文件,然后通过dump文件来调试程序为什么崩溃.但是windo ...

随机推荐

  1. javascript中的双向绑定

    阅读目录 一:发布订阅模式实现数据双向绑定 二:使用Object.defineProperty 来实现简单的双向绑定. 前言: 双向数据绑定的含义:可以将对象的属性绑定到UI,具体的说,我们有一个对象 ...

  2. 《TCP-IP详解卷1:协议》【PDF】下载

    <TCP-IP详解卷1:协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介<TCP/IP详解卷1:协 ...

  3. 【python】字符串

    >>> str1="welcom to China">>> str1[2:4]'lc'>>> str1[7]'t'>&g ...

  4. 【java】扫描流Scanner接收输入示例

    多用Scanner少用InputStream 多用BufferedReader少用Reader 多用PrintStream少用OutputStream 多用PrintWriter少用Writer pa ...

  5. 【二十五】cookie与session学习总结

    一:cookie 1.创建cookie 关键字:setcookie 用于保存cookie 原理:当浏览器访问cookie.php页面时,我们的服务器就会以set-cookie的方式将cookie信息回 ...

  6. 解读JavaScript原型链

    var F = function(){}; F.prototype.a = function(){}; Object.prototype.b = function(){}; Function.prot ...

  7. CSS文字不换行,溢出省略

    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;

  8. Android Looper原理分析

    实际业务使用场景: 某业务场景需要将本地数据传递到服务端,服务端再返回传递成功或者失败的信息. 1. 失败时: 重传5次 2.设置客户端请求的最小时间间隔,这个间隔内最多请求1次 具体逻辑如下:(这里 ...

  9. Java面试题汇总

    第一阶段:三年我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本 上的内容迈向真正的企业级开发.我们知道如何团队 ...

  10. K:java 断言 assert 初步使用:断言开启、断言使用

    @转自天地悠悠的个人博客 主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言是可以局部开启的,如:父类禁止 ...