学习用WinDbg查看程序当前运行的堆栈
使用场景
假设自己开发的程序出现了未知原因的卡死,该怎么调查呢?
最好的方式肯定是用VS重现一下,查看卡死时候的堆栈来调查。
但很多时候这种理想的情况不存在,一是重现的时间可能很长,二是可能不稳定,所以当前卡死的情况可能是“珍贵”的。
此时最好的方法是使用VS附加(Attach)到进程。但这个也有一些限制。
另一种方式是,创建转储(dump)文件,而这个dump文件可以用WinDbg来打开调查运行的堆栈。最近同事教了我这种方法解决了一个问题,我备忘一下。
0. 创建转储(dump)文件
为了测试,我在UE里面故意做一个按钮,点击就 Sleep 30秒来模拟程序卡死的情况:
等点击按钮后进入卡死的时候。打开任务编辑器,右键这个进程“创建内存转储文件”。
等待一段时间
创建好后,会告诉你位置。
1. 下载安装WinDbg
Install WinDbg - Windows drivers | Microsoft Learn
2. 使用WinDbg查看程序当前运行的堆栈
打开WinDbg。选择 Open dump file,并且填入刚才保存的dump文件。
在Stack界面即可看到堆栈,此时可以看到是调用了 Sleep 造成的卡死。