Windows程序卡顿、无响应问题定位

恋习Python

共 1432字,需浏览 3分钟

 ·

2022-02-16 20:49


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

浏览 133
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报