介绍

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. gunicorn 信号处理(SIGHUP,SIGUSR2)

    在这篇文章中,提到了Master进程对信号的处理函数,其中有两个信号比较有意思. SIGHUP:用来热更新(Reload)应用 SIGUSR2:用来在线升级(upgrade on the fly)gu ...

  2. Android查缺补漏--ContentProvider的使用

    ContentProvider (内容提供者)是一种共享型组件,可以为系统内应用于与应用之间提供访问接口. ContentProvide要想正常工作需要三个关键点: ContentProvider:对 ...

  3. 3. python文件操作

            5 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读:   不存在则创建:存在则只追加内容:]        ...

  4. Web服务器、应用服务器、Web容器、反向代理服务器区别与联系

    作者: 帅虫哥 出处:www.cnblogs.com/vipyoumay/p/7455431.html(点击尾部阅读原文前往) 我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web ...

  5. 用Azure AD 实现Web 应用身份认证的Multi-Factor Authentication(MFA)

    最近客户有个需求,希望把面向public的Web应用中的终端用户数据库由Azure AD来实现,同时希望可以用MFA来实现用户身份认证.这个想法非常好,通过使用Azure的managed servic ...

  6. Spring框架(四)AOP面向切面编程

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  7. ES6之Promise

    Promise是一个对象,用来传递异步操作的消息,他有两个特点:第一对象的状态不受外界的影响,第二一旦状态改变就不会在变,任何时候都可以得到这个结果,他有两个参数分别是resolve(他的作用是将Pr ...

  8. Errors are values

    原文地址 https://blog.golang.org/errors-are-values Go程序员之间(特别是这些刚接触Go语言的新人)一个常见的讨论点是如何处理错误.谈话经常变成为对如下代码序 ...

  9. Vue 爬坑之路(八)—— 使用 Echarts 创建图表

    在后台管理系统中,图表是一个很普遍的元素.目前常用的图标插件有 charts,  Echarts, highcharts.这次将介绍 Echarts 在 Vue 项目中的应用. 一.安装插件 使用 c ...

  10. 安卓电量优化之AlarmManager使用全部解析

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.AlarmManager概述 AlarmManager是安卓系统中一种系统级别的提示服务,可以在我们设定时间或者周期性的执行一个intent,这 ...