Windbg的一些简单使用命令

一、崩溃

1、  输入.ecxr;kbn得到崩溃的堆栈

其中源代码如下

2、  查看堆栈和源代码,发现第0帧导致崩溃,代码也是本地代码

输入.frame  0,切到第0帧如下

3、  输入 dv 查看当前帧的一些变量信息

发现变量p =0x00000000

二、句柄泄漏

1、  启动进程

2、  用windbg附加到进程

3、  !htrace  -enable命令开启句柄检测

4、  !htrace  –snapshot

5、  运行一段时间后

6、  !htrace –diff

得到如下信息

标红函数创建了event

7、输入lsahandleLeak!ThreadProc1+0x00000037

这样就可以看出代码中在不停CreateEvent。

补充:

可以在windbg调式中,输入!handle可以得到当前堆栈的一些句柄信息,可以看出这个堆栈event非常多。

三、死锁

1、  启动进程

2、  Windbg附加进程

3、  输入~*kv, 输出所有线程

4、  输入!findstackntdll!RtlEnterCriticalSection,查找哪些线程在等待锁

或者看代码某一函数没执行,对比windbg中的线程,找到线程id分析

图1是源代码,图2是执行结果, ThreadProc1函数中的” ThreadProc1 lock g_mutex2”没发生,怀疑是否死锁了

5、windbg中线程信息如下,发现ThreadProc1在等某一把锁

第三帧是本地代码对比源代码发现在等锁g_mutex2;

第二帧是系统函数在等待锁,锁地址为00bf7140

6、输入!cs 00bf7140,查看这把锁信息

发现锁的占有者是0x00002cc4

7、输入~~[0x00002cc4],发现对应是3号线程

8、切到3号线程,并输出堆栈

发现代码27号,也在等一把锁,锁地址00bf7158

9、同理输出锁信息

10、发现锁占有者0x00004c80,切到线程0x00004c80,并输出堆栈

发现是刚才的2号线程

至此分析完成2号线程和3号线程发生死锁。

四、CPU高

1、  启动进程

2、  Windbg附加进程

3、  输入!runaway

4、  发现2号线程cpu最高,切到2号线程,并输出堆栈

5、  可以得到是cpuhigh!ThreadProc1+0x35

五、内存泄漏

5.1、windbg手动分析

1、设置gflags.exe,这工具和windbg在同一目录

2、  windbg附加到进程,输入!heap –s

3、程序运行一段时间之后,再次输入!heap–s

发现00970000这个堆有增加,其他无变化

4、输入!heap -stat -h00970000,查看这个堆状态

发现这个堆的内存主要是被大小为0x224的块占用

5、输入!heap -flt s 224, 查看224这些块被谁在使用

6、输入!heap -p -a 00971d20,查看堆栈

7、  已经得到堆栈,本地有源代码,还可以查看代码,

输入lsa memoryleak!ThreadProc1+0x00000048

5.2、利用umdh分析

1、同5.1设置gflags配置

2、开启命令窗口cmd,输入要定位内存泄露的程序gflags.exe /i memoryleak.exe +ust

3、  设置程序的符号表路径

SET _NT_SYMBOL_PATH=SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols;F:\windbgtest\Debug

4、  启动memoryleak.exe,利用umdh创建第一次heap快照

输入umdh-pn:memoryleak.exe -f:memory1.log

5、  运行一段时间后,再次输入快照,umdh -pn:memoryleak.exe -f:memory2.log

6、  分析前后2次快照的差异umdh -dmemory1.log memory2.log -f:memoryleak.log

会在当前路径下面生成memoryleak.log,打开分析

7、

定位到代码,需要具体分析逻辑,查看是否真的泄漏,还是还没来得及释放。

利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏的更多相关文章

  1. 【内存泄漏】 C/C++内存泄漏及其检测工具

    对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等.Smart Po ...

  2. Windows下利用Windbg 分析dump

    概述: 注册生成dump文件的函数. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题. 如下代码生成dump ...

  3. 利用Windbg分析Magicodes.IE一次错误编写导致内存剧增

    由于这近一年时间一直忙于写书和工作,一直没有水文,但是近期有几位朋友使用我们的Magicodes.IE反馈在导出过程中内存暴涨...好吧,不管怎样,不能苦了我们朋友,接下来我们通过windbg来看一下 ...

  4. 转 Delphi中使用FastMM4结合View CPU避免内存泄漏

    http://www.cnblogs.com/kongchao/archive/2009/10/27/1590479.html 核心提示:内存泄漏经常出现在本地代码中,特别是多线程和发生异常的情况下, ...

  5. java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏

    Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...

  6. windbg分析一次大查询导致的内存暴涨

    项目上反馈了一个问题,就是在生产环境上,用户正常使用的过程中,出现了服务器内存突然暴涨,客户有点慌,想找下原因. 讲道理,内存如果是缓慢上涨一直不释放的话,应该是存在内存泄漏的,这种排查起来比较困难, ...

  7. Web 2.0 浏览器端可靠性测试第2部分(如何发现和分析 Web 2.0 浏览器端的内存泄漏)

    介绍浏览器端的可靠性测试 在上一编文章中我们介绍了浏览器端可靠性测试的概念.测试方法.以及常用的测试和分析工具.我们知道,浏览器端可靠性测试,就是以浏览器为测试平台,通过模拟用户在真实场景下的页面操作 ...

  8. 利用windbg 分析IIS 的线程池w3wp程序多线程挂起问题

    前几天有个朋友发个了在windows server 2008跑的IIS 跑的程序w3wp程序dmp,要我帮忙分析为何线程都挂起不运行 经过查阅资料用windbg可以调试可以输出线程的调用堆栈,但是准备 ...

  9. valgrind检查代码内存泄漏,5种内存泄漏情况

    摘要: valgrind是linux下用于调试程序和查找内存泄露的常用工具.valgrind会报告5种内存泄露,"definitely lost", "indirectl ...

随机推荐

  1. JavaScript 引擎 V8 执行流程概述

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/t__Jqzg1rbTlsCHXKMwh6A作者:赖勇高 本文主要讲解的是V8的技术,是V8的入 ...

  2. Java描述设计模式(13):迭代器模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.迭代器模式 1.基础概念 迭代器模式又叫游标模式,是对象的行为模式.迭代器模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象. 2 ...

  3. 程序员修神之路--redis做分布式锁可能不那么简单

    菜菜哥,复联四上映了,要不要一起去看看? 又想骗我电影票,对不对? 呵呵,想去看了叫我呀 看来你工作不饱和呀 哪有,这两天我刚基于redis写了一个分布式锁,很简单 不管你基于什么做分布式锁,你觉得很 ...

  4. (五十一)c#Winform自定义控件-文字提示-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  5. webpack + typescript + babel打包*.min.js文件的环境配置

    将多个*.ts文件打包成一个*.min.js文件的开发配置 1.初始化 npm init 新建以下文件目录: 2.安装依赖: "devDependencies": { " ...

  6. 《Linux/UNIX系统编程手册》第56章 SOCKET:介绍

    关键词: 1. socket基础 一个典型的客户端/服务器场景中,应用程序使用socket进行通信的方式如下: 各个应用程序创建一个socket.socket是一个允许通信的设备,两个应用程序都需要用 ...

  7. 0day2安全——笔记4(修改临界变量)

    第二章 修改临界变量 #include <stdio.h> #include <string.h> #define PASSWORD "1234567" i ...

  8. leetcode 双周赛9 找出所有行中最小公共元素

    给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...

  9. 15.flag在index里

    查看一下源代码 点进去,发现没有什么有价值的东西~ 根据题目提示flag在index.php里面,所以我们可以通过php://filter读取文件内容 构造payload: http://123.20 ...

  10. 第二章 简单的HTTP协议

    第二章 简单的HTTP协议 针对HTTP协议结构进行讲解 1.通过请求和响应的交换来达成通信目的 应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器端角色. [请求报文]是由请求方法.UR ...