当windows程序出现异常、界面卡顿、无响应情况时,在有工程和源码的情况下,程序员通常是打开IDE,在DEBUG模式下进行调试。但如果是一个RELEASE程序,且无调试环境,该如何来定位呢。

  这里介绍一下通过adplus导出dump文件,用windbg来查看的方法。

windbg

  在这之前,先大概了解一下windbg。简单来说windbg就是Windows下对用户态/内核态的程序进行调试、分析的工具。不仅提供了图形界面操作,还有着着强大的调试命令。

  adplus是一个Microsoft Product Support Services (PSS) 的工具,可以用来排查任何进程或者应用程序的停止响应(hang),或者崩溃(crash)的错误。

  windbg和adplus 都随 Microsoft Debugging Tools for Windows 一起提供。

  下载地址: https://developer.microsoft.com/zh-cn/windows/downloads/windows-10-sdk/

  安装的时候可以选择需要的功能,不用全都装,不然会比较大。

一个例子

  下面通过一个例子来看一下吧。

  先模拟一个有问题的界面程序。这里用VC创建一个MFC对话框程序,添加了一按钮,点击按钮会进入死循环。  

void CtestDlg::OnBnClickedButtonLoop()
{
while (true) {}
}

  

  点击“死循环”按钮,程序出现无响应的情况。

  这个时候需要用到adplus了。如果winsdk正常安装的话,windbg 和 adplus 会存放在“C:\Program Files (x86)\Windows Kits\10\Debuggers\x86”路径下。

  adplus 具有两种操作模式:

  • “Hang”模式用于解决进程挂起、100% CPU 使用率以及不涉及崩溃的其他问题。
  • “Crash”模式用于解决崩溃问题,或者用于解决导致程序或服务意外退出的任何其他类型的错误。

  adplus 的具体使用就不做介绍了,这里仅用到 Hang 模式,用来抓取程序的快照,导出dump文件。

adplus -hang -pn test.exe -quiet -o e:\dumps

  

  在控制台执行上述命令,执行成功的话会有类似如下打印,并在“e:\dumps”目录下生成dump文件。

接下来,打开windbg,点击“File”->“Open Crash Dump...”,选择刚才导出的dump文件。

然后在windbg下方的命令行输入kb,windbg会打印出当前进程的调用栈。

一般来说,通过查看进程的调用栈,就能大概知道程序出错的地方了。

如果无法显示符号名称,请点击“File”->“Symbol File Path...”来设置pdb文件的路径。

windbg的其它命令:

  ~          简洁地显示当前进程的所有线程,
  ~*        表示所有线程
  ~0kp    显示第一个线程栈
  ~*kp    显示所有线程栈

Windows程序卡顿、无响应问题定位的更多相关文章

  1. C#中多线程写DataGridView出现滚动条导致程序卡死(无响应)的解决办法

    因为写的程序涉及到多线程维护一个DataGridView,然后蛋疼的发现经常卡死...一开始以为是读写冲突的原因,然后就加了锁,问题依旧...然后发现每次出现滚动条的时候程序才会无响应,所以感觉应该是 ...

  2. c#中多线程写DataGridView出现滚动栏导致程序卡死(无响应)的解决的方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013529927/article/details/24225567 由于写的程序涉及到多线程维护一 ...

  3. 关于Office软件中Word输入时卡顿无反应的解决办法!

    最近在安装office2013时遇到了这样一个问题,就是在激活office之后,打开Word输入内容时十分卡顿.也是狂搜网上各种办法,有说改注册表的,也有说在office选项里设置什么输入法的,全试了 ...

  4. C#多线程解决程序卡顿问题

    描述: 在 C# 中,System.Threading.Thread 类用于线程的工作.它允许创建并访问多线程应用程序中的单个线程.进程中第一个被执行的线程称为主线程. 案例: static void ...

  5. ueditor富文本编辑器——上传图片按钮卡顿,响应慢

    最近负责将公司官网从静态网站改版成动态网站,方便公司推广营销人员修改增加文案,避免官网文案维护过于依赖技术人员.在做后台管理系统时用到了富文本编辑器Ueditor,因为公司有一个阿里云文件资源服务器, ...

  6. Win8/Win10下程序经常无响应的解决办法

    如果你使用Win8/Win10系统时经常出现程序无响应的问题不仿试下如下解决办法. 表现症状: 任何程序都有可能出现无响应(记事本.Visual Studio.QQ.视频播放器等) 一旦一个程序出现未 ...

  7. Delphi XE6 使用定时器或者线程解决程序界面无响应问题

    ---恢复内容开始--- 介绍 在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关闭”的提示,这个非常不好,所 ...

  8. Android app 性能优化的思考--性能卡顿不好的原因在哪?

    说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...

  9. Win 10卡顿怎么办?解决win10卡顿的方法大汇总

    最近微软开始向Windows 10用户推送创造者更新(Creators Update),相信也有很多小伙伴已经尝鲜了这一最新的版本.而对于win10的使用体验,很多小伙伴第一个抱怨的问题便是win10 ...

随机推荐

  1. py基础之模块与包

    '''模块:当代码越来越多时,将所有代码放入一个文件中便会无法维护,所以放到多个文件中去,这样每一个py文件就是一个模块 包:模块越来越多时容易重名,便将模块放入不同的包中,每个包中必须有一个__in ...

  2. 小程序开发技巧(三)-- 云开发时效数据刷新和存储 (access_token等)

    小程序云开发时效数据刷新和存储 (access_token等) 1.问题描述 小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数 ...

  3. 菜鸟系列Golang学习 — 切片

    切片简介 切片也是一种数据类型,在Golang中,切片底层基于数组实现的. 我们定义切片如下 var slice []int 切片之所以出现,是为了更好的利用资源,管理数据,如果使用数组,则我们一开始 ...

  4. emmet快速缩写展开的基本写法与心得

    emmet的基本写法: .ct 点是class <div class="ct"></div> #ct 井号是id <div id="ct&q ...

  5. Java 八种基本类型和基本类型封装类

    1.首先,八种基本数据类型分别是:int.short.float.double.long.boolean.byte.char:   它们的封装类分别是:Integer.Short.Float.Doub ...

  6. var, let ,const区别

    ES6中加入了let,const字符,先说说新的区别: 作用域:let 声明的变量只在它所在的代码块内有效,而且不存在变量提升,即变量可以在声明之前使用,值为undefined.let未声明变量前会报 ...

  7. WEB渗透 - 万能密码

    asp万能密码 'or'='or' aspx万能密码 1: "or "a"="a 2: ')or('a'='a 3:or 1=1-- 4:'or 1=1-- 5 ...

  8. office一直提示配置进度与图标问题

    原来安装了wps office,广告太烦,于是卸载了wps安装Microsoft office 2010,安装完成后每次打开excel文件都要重新安装配置,修改注册表norereg和设置兼容模式都不行 ...

  9. 01-if条件语句之数字比较

    if条件语句之数字比较 #!/bin/bash # 使用expr命令,比较结果正确,输入1,错误输入0 expr_mode(){ if [ $(expr $1 \<\= $2) -eq 1 ]; ...

  10. 2020 还不会泡 Github 你就落伍了

    前言 回想起两年前缸接触 GitHub 那会儿,就发现网上完全搜不到一篇关于 github 使用的文章,虽然自己倒腾几下慢慢的也就上手了,但毕竟花费了不少时间. 时间对每个人都是宝贵的,一直很好奇 G ...