当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    显示所有线程栈

最新文章

  1. ios获取设备信息总结
  2. ytu 1937:查找最大元素(水题)
  3. ubuntu vi/vim编辑器必知必会
  4. 第六讲(二) Hibernate HQL查询
  5. SharePoint DataFormWebPart 通过Caml和xslt聚合内容
  6. github import repository创建github仓库
  7. 后缀数组之hihocoder 重复旋律1-4
  8. dedecms 下载时弹出提示登录框或直接下载
  9. C语言之任意进制的转换
  10. 并发之lock的condition接口
  11. await和async在一般处理程序中的使用
  12. python 回溯法 子集树模板 系列 —— 3、0-1背包问题
  13. eclipse如何debug调试jdk源码,并显示局部变量
  14. 取值:form表单取值、input框绑定取值
  15. 隐藏的Swiper显示后无法获取正确的宽度和高度
  16. noip模拟题《迷》enc
  17. Ubuntu Phone开箱上手
  18. TortoiseSVN教程
  19. 数据库设计系列之四--ER图
  20. 谷歌(google)世界各国网址大全

热门文章

  1.  前端面试题目总结1
  2. MUI使用H5+Api调取系统相册多图选择及转base64码
  3. JZOJ 3453.【NOIP2013中秋节模拟】连通块(connect)
  4. 安装ArchLinux时遇到的部分问题
  5. MySQL 整体架构一览
  6. selenium 操作 获取动态页面数据
  7. des 加密解密工具类
  8. 在云服务搭建jupyter环境
  9. 图解I/O模型
  10. Shell:sed用法 - 查找并替换字符串