1. 引入篇

所谓技术分享,其实是一个自我总结和相互学习、不断成长的过程。

考虑到之前原创的文章http://www.cnblogs.com/LoveOfPrince/p/6032523.html《记一次内存泄漏DUMP分析》被转载,而且有的没有说明出处,这里所有的图片都打了标记,不好意思啊。

1.1 下载安装

WinDbg是微软发布的一款免费而十分强大的调试工具,从官网下载Microsoft Windows SDK,选择安装“Debugging Tools for Windows”。

1.2 调试器

安装目录下,有四个调试器程序。

cdb.exe和 ntsd.exe只支持用户模式调试;Kd.exe主要用于内核调试,有时候也用于用户模式。上述三者只能在控制台界面以命令行形式工作。

Windbg.exe采用可视化的用户界面,支持用户模式和内核模式调试。在两种模式下,都支持实时调试模式和事后调试模式。另外,还支持源码级的调试。

1.3 操作界面

2. 命令篇

2.1 按照来源划分

2.1.1 基本命令

用?查看基本命令

2.1.2 元命令

用.help查看元命令

2.1.3 扩展命令

用.chain查看扩展模块,再查看指定模块下的所有扩展命令

2.2 按照功能划分

2.2.1 系统信息

为了下载和本地系统匹配的符号,可用如下命令查看本地系统信息。

这里列出了操作系统版本、系统持续运行时间、调试时间等信息。

2.2.2 进程

WinDbg能够同时调试多个进程。可以直接附加已经存在的进程,也可以创建新的进程并附加上去。

要调试目标进程,需要先切换到该进程。

进程切换后,可检查当前进程的环境信息,以确认是否切换成功。

查看进程信息。

也可以查看包含的程序域信息。

最后,结束对当前进程的调试。

2.2.3 模块

列出了当前调试进程要加载的符号信息。

模块信息相关的命令。

比如这里讲模块保存为程序集,反编译看看效果还不错,不过有些变量名不是能直接看懂的。

比如查看模块镜像文件重定位信息,可以发现基本上都是最优的。

再比如查看PE头信息。

2.2.4 符号

在创建二进制镜像文件时,伴生的后缀名为.dbg、.sym或.pdb的文件称为符号文件,包含如下符号信息:
  1)源文件路径以及每个符号的行号。
  2)变量的名字和地址。
  3)函数名称、地址及其原型。
  4)帧指针优化数据。
  5)变量、结构等的类型信息。

符号路径用于告诉调试器去哪里寻找符号文件,调试过程中,只有正确设置了符号路径,使得调试器能够将调试目标、符号文件以及源码文件一一对应起来,才能够最好地发挥调试器的强大功用。

如果涉及到成千上万个符号文件,以及同一个符号文件存在不同平台下的不同版本的时候,那么一一手动设置符号路径肯定是不现实的,于是引入符号服务器的概念。符号服务器有一套命名规则,使得调试器能够正确找到对应平台和版本的符号文件。

WinDbg访问符号需要两个文件(SYMSRV.DLL 和 SYMSTORE.EXE),需要设置系统变量告诉他这两个文件放在什么地方。

2.2.5 线程

查看线程的基本信息。

比如列出所有线程。

线程号是由调试器软件内部维护的线程ID值,是一个从0开始的整数,在外部是没有太大意义的。
线程ID是系统维护的系统唯一的ID值。
线程的冻结状态,决定了是否分发CPU时间给它。

再比如列出所有托管线程。

查看线程的堆栈信息。

线程的时间信息,包括三个方面:自创建之初到现在的总消耗时间、用户模式执行时间、内核模式执行时间。

除了耗时,还可以查看线程池的信息。

2.2.6 内存

内存是存储数据、代码的地方,通过内存查看命令可以分析很多问题。

查看堆上的信息。

查看大对象。

查看谁持有了对象。

2.2.7 事件

Windbg是事件驱动的。

事件分析。

比如程序故障分析。

比如电脑蓝屏故障分析。

查看C盘确实发现百度浏览器目录,卸载百度杀毒、删除C盘百度浏览器(也可清理下注册表)。
重启电脑,恢复正常。

3. 探讨篇

3.1方法内联

默认情况下,Release版本进行了各种优化。
其中,将被调用方法的方法主体移入调用方的主体,就可以避免某些方法的调用开销,这一操作称为方法内联。

通过反编译,查看寄存器信息。

可以发现,DoCalc方法被内联,而Calc方法却不会。

这里提到一个问题,什么是优秀的代码,我的理解是除了让人看的舒服,还要更贴近编译优化后的代码。

3.2 字符串驻留池

程序启动时,系统域中的驻留池负责管理被驻留的字符串。

抓取DUMP分析,查找这些字符串的根。

发现都在一个object数组中,查看这个数组。

哦,原来如此。。。

当然除了DUMP分析,还有一些其他界定问题的方案:
1.程序日志,本地模拟重现。
2.VS性能分析器
3.系统日志、事件查看器、性能分析器。

引用架构师修炼中的一段话:发现问题永远都比解决问题更加重要。

话说到这,我是不是改停下了,赶紧找个妹子先???

Windbg DUMP分析(原创汇总)的更多相关文章

  1. Windbg DUMP

    Windbg DUMP分析(原创汇总) 1. 引入篇 1.1 下载安装 1.2 调试器 1.3 操作界面2. 命令篇 2.1 按照来源划分 2.1.1 基本命令 2.1.2 元命令 2.1.3 扩展命 ...

  2. 调试技巧 —— 如何利用windbg + dump + map分析程序异常

    调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传   调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...

  3. dump 分析模式之 INCORRECT STACK TRACE - djm2005dy的专栏 - 博客频道 - CSDN.NET

    Dump 分析模式之 INCORRECT STACK TRACE dump 分析模式之 INCORRECT STACK TRACE 翻译自 MDA-Anthology Page288  初学者常犯的错 ...

  4. 面向.Net程序员的dump分析

    背景 Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.在 Windows 系统上, dump 文件分为内核 dump 和用户态 dump 两种.前者一般用来分析内核相 ...

  5. .net core dump分析

    服务器上如果出现cpu内存饱满,找不到原因,那么dump文件分析必不可少. 起初是想在linux下调试.net core 的dump,但是环境一直无法安装 搞了许久没搞出来,其次文章太少了,googl ...

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

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

  7. 鸿蒙内核源码分析(汇编汇总篇) | 所有的汇编代码都在这里 | 百篇博客分析OpenHarmony源码 | v40.03

    百篇博客系列篇.本篇为: v40.xx 鸿蒙内核源码分析(汇编汇总篇) | 汇编可爱如邻家女孩 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...

  8. 一个网关服务性能问题的Dump分析

    本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结. 一 Windbg介绍 1.Windbg是个非常强大的调试器,它设计了 ...

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

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

随机推荐

  1. java byte【】数组与文件读写(增加新功能)

    今天在测试直接写的文章: java byte[]数组与文件读写 时,想调用FileHelper类对字节数组以追加的方式写文件,结果无论怎样竟然数据录入不全,重新看了下文件的追加模式,提供了两种方式: ...

  2. java-6数组

    一. 请编写一个程序将一个整数转换为汉字读法字符串.比如"1123"转换为"一千一百二十三".更进一步,能否将数字表示的金额改为"汉字表达?比如将&q ...

  3. jquery与ajax的XMLHttpRequest对象介绍

    首先  认识一个对象 这个对象叫XMLHttpRequest XMLHttpRequest对象可以提供在不刷新页面的情况下向服务器发送异步请求,并且接受服务器端返回的结果.从而实现局部更新当前页面的功 ...

  4. ubuntu下包管理器apt-get常用命令

    apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...

  5. 【java基础之jdk源码】Object

    最新在整体回归下java基础薄弱环节,以下为自己整理笔记,若有理解错误,请批评指正,谢谢. java.lang.Object为java所有类的基类,所以一般的类都可用重写或直接使用Object下方法, ...

  6. 浅谈PHP的CI框架(一)

    作为前端开发人员,掌握一门后端语言是必不可少的,PHP的CI框架是一个快速开发框架,基于MVC,比较接近原生PHP,在原有的PHP代码上封装了许多类,易上手,容易扩展,适用于小项目,并且CI的文档及案 ...

  7. MAC软件下载链接地址

    博客开启,今天向大家推荐一款MAC软件大全地址. 下载地址:http://www.pc6.com/mac/111949.html

  8. FineUIMvc随笔 - 怎样在控件中嵌套 HTML

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户需求 有网友在<FineUI总群1>问这么一个问题:怎么把 HTML 嵌套在控件中? 这是很多刚学习 FineU ...

  9. wamp下安装php的xdebug调试的方法

    wamp下安装php的xdebug调试的方法 将下载好的php_xdebug-2.1.2-5.2-vc6.dll放在D:/wamp/php/ext/php_xdebug-2.1.2-5.2-vc6.d ...

  10. CORS(跨域资源共享)

    Cors(Cross-origin Resource Sharing)基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方,从而决定响应成功与否. CORS与JSONP对比: 1.JSON ...