利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏
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高,内存泄漏的更多相关文章
- 【内存泄漏】 C/C++内存泄漏及其检测工具
对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garbage Collection等.Smart Po ...
- Windows下利用Windbg 分析dump
概述: 注册生成dump文件的函数. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题. 如下代码生成dump ...
- 利用Windbg分析Magicodes.IE一次错误编写导致内存剧增
由于这近一年时间一直忙于写书和工作,一直没有水文,但是近期有几位朋友使用我们的Magicodes.IE反馈在导出过程中内存暴涨...好吧,不管怎样,不能苦了我们朋友,接下来我们通过windbg来看一下 ...
- 转 Delphi中使用FastMM4结合View CPU避免内存泄漏
http://www.cnblogs.com/kongchao/archive/2009/10/27/1590479.html 核心提示:内存泄漏经常出现在本地代码中,特别是多线程和发生异常的情况下, ...
- java dump 内存分析 elasticsearch Bulk异常引发的Elasticsearch内存泄漏
Bulk异常引发的Elasticsearch内存泄漏 2018年8月24日更新: 今天放出的6.4版修复了这个问题. 前天公司度假部门一个线上ElasticSearch集群发出报警,有Data Nod ...
- windbg分析一次大查询导致的内存暴涨
项目上反馈了一个问题,就是在生产环境上,用户正常使用的过程中,出现了服务器内存突然暴涨,客户有点慌,想找下原因. 讲道理,内存如果是缓慢上涨一直不释放的话,应该是存在内存泄漏的,这种排查起来比较困难, ...
- Web 2.0 浏览器端可靠性测试第2部分(如何发现和分析 Web 2.0 浏览器端的内存泄漏)
介绍浏览器端的可靠性测试 在上一编文章中我们介绍了浏览器端可靠性测试的概念.测试方法.以及常用的测试和分析工具.我们知道,浏览器端可靠性测试,就是以浏览器为测试平台,通过模拟用户在真实场景下的页面操作 ...
- 利用windbg 分析IIS 的线程池w3wp程序多线程挂起问题
前几天有个朋友发个了在windows server 2008跑的IIS 跑的程序w3wp程序dmp,要我帮忙分析为何线程都挂起不运行 经过查阅资料用windbg可以调试可以输出线程的调用堆栈,但是准备 ...
- valgrind检查代码内存泄漏,5种内存泄漏情况
摘要: valgrind是linux下用于调试程序和查找内存泄露的常用工具.valgrind会报告5种内存泄露,"definitely lost", "indirectl ...
随机推荐
- .NET Application,Session,Cookie,ViewState,Cache对象用法
作用域 保存地址 生命周期Application 应用程序 服务器内存 IIS启动Session 整个站点 服务器内存 Session到时 默认20分钟Cashe 应用程序 服务器内存 应用程序的周期 ...
- Java入门系列之集合LinkedList源码分析(九)
前言 上一节我们手写实现了单链表和双链表,本节我们来看看源码是如何实现的并且对比手动实现有哪些可优化的地方. LinkedList源码分析 通过上一节我们对双链表原理的讲解,同时我们对照如下图也可知道 ...
- 在Python中反向遍历序列(列表、字符串、元组等)的五种方式
1. reversed() a = [1, 2, 3, 4] for i in reversed(a): print(i) 2. range(len(a)-1, -1, -1) a = [1, 2, ...
- Vue中调用另一个组件中自定义事件
之前在一个场景中,遇到组件需要调用父组件中的方法tableInit(),字组件调用父组件常用的有三种方法,具体参考:https://www.cnblogs.com/jin-zhe/p/9523782. ...
- Python3 进程、线程和协程
Infi-chu: http://www.cnblogs.com/Infi-chu/ 进程.线程和协程的对比 1.定义对比 进程:是系统进行资源分配的基本单位,每启动一个进程,操作系统都需要为其分配运 ...
- JS基础语法---编程思想和对象
编程思想: 把一些生活中做事的经验融入到程序中 面向过程:凡事都要亲力亲为,每件事的具体过程都要知道,注重的是过程 面向对象:根据需求找对象,所有的事都用对象来做,注重的是结果 面向对象特性: 封装, ...
- ALV字段设置更改后,展示不同步的问题
案例: 一个需要用户交互的ALV,比如某字段设置为输入长度20,不区分大小写.用户要求输入长度改为50,且要求区分大小写. 处理方式: 如果本来ALV字段设置时,采用的是ref_table和ref_f ...
- iOS sqlite ORM框架-LKDBHelper
LKDBHelper 一个sqlite ORM(全自动操作数据库)框架. 线程安全.不再担心递归锁死的问题 安装要求 iOS 4.3+ 仅支持 ARC FMDB 添加到你的项目 如果你使用 Cocoa ...
- Linux:RPM安装工具的使用
RPM安装工具的使用 RPM包管理工具介绍 RedHat 软件包管理工具(RedHat Package Manager,RPM) RPM 软件包工具常用于软件包的安装.查询.更新升级.校验.卸载以及生 ...
- linux环境搭配
1.linuxLinux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Unix工具软件.应用程序和网络协议 ...