介绍

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. effective java笔记之java服务提供者框架

    博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...

  2. MPSOC之3——centos环境配置及petalinux安装及使用

    ubuntu虽然能正常安装,但是build时会出现闪退情况,闪退后一切归零,没啥错误提示,改用centos来安装petalinux. 0.环境 vmware pro 14,centos 7.3 pet ...

  3. bandit_pass

    boJ9jbbUNNfktd78OOpsqOltutMc3MY1CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9UmHadQclWmgdLOKQ3YNgjWxGoRMb5luKpIwr ...

  4. Django安装与开发虚拟环境搭建01

    Django是一款基于python的MVT的web开发框架(m表示model,主要用于对数据库层的封装  ,v表示view,用于向用户展示结果,c表示controller,是核心,用于处理请求.获取数 ...

  5. 《C++程序设计语言(十周年纪念版)》【PDF】下载

    <C++程序设计语言(十周年纪念版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382171 内容简介 <C++程序设计 ...

  6. linux根目录扩容

    原来在ucloud上面买了一个服务器,结果根目录上面只有20G,/data挂载点下面有500G,没多久/根目录存储空间用完了,所以要扩展 linux的文件模式分为lvm模式和普通的非lvm模式,云服务 ...

  7. 【JMeter】if语句中不能Failure=false解决办法

    错误写法: if(roomId.matches("regEx")) Failure=false; else{ Failure=true; FailureMessage=" ...

  8. 挑战App Store,微信通过“跳一跳”秀了一下“小程序”的肌肉

    2017年即将结束的时候,微信放了一个大招.随着最新的微信v6.6.1版本更新,基于小程序的"小游戏"板块正式上线.微信上首发的这款"小游戏"叫"跳一 ...

  9. 前端MVC Vue2学习总结(四)——条件渲染、列表渲染、事件处理器

    一.条件渲染 1.1.v-if 在字符串模板中,如 Handlebars ,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {{#if ok}} <h1&g ...

  10. bzoj 2727: [HNOI2012]双十字

    Description 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的"1"线段组成,要求满足以下几个限制: 我们可以找到 5 个 ...