勇哥注:
最近开发的软件遇到一些问题,主要是爆cpu时间,这样的后果是软件运行时间一长就会越跑越慢,最终UI失去响应。
用vs来排除,目前只知道对可疑代码进行失能,再配合任务管理器观察 :cpu使用率, cpu时间,线程,句柄等参数来判断可疑代码是不是有问题。
如果搜索一下网络,貌似这个问题大部分答案只是对线程做sleep,没啥子可用的信息。
因此是时候涨点知识了,我把学习方向放在用WinDbg调试用户模式.net程序上。
这第一篇我就摘炒一下微软的在线文章,不过操作截图我都会自己来过。
WinDbg 是包含在 Windows 调试工具中的内核模式和用户模式调试器。 在此,我们将提供实践练习,这些练习帮助你开始使用 WinDbg 作为用户模式调试器。
有关如何获取 Windows 调试工具的信息,请参见 Windows 调试工具(WinDbg、KD、CDB、NTSD)。
安装调试工具后,找到 64 位 (x64) 和 32 位 (x86) 版本工具的安装目录。 例如:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
启动记事本并附加 WinDbg
导航到安装目录,然后打开 WinDbg.exe。
在“文件”菜单上,选择“打开可执行文件” 。
在“打开可执行文件”对话框中,导航到包含 notepad.exe 的文件夹(通常是 C:\Windows\System32)。 输入 notepad.exe 作为“文件名称” 。 选择“打开”。
(图1)
图1是勇哥win10电脑上,打了win10sdk补丁后的windbg 64位版本,奇怪的是微软文章中的windbg是图2这样的。
也许是执行目录下另有一个exe。
(图2)
3. 在 WinDbg 窗口底部的命令行中,输入以下命令:
输出类似于以下内容:
(图3)
符号搜索路径指示 WinDbg 查找符号 (PDB) 文件的位置。 调试器需要符号文件来获取有关代码模块的信息(函数名、变量名等)。
输入此命令,它会通知 WinDbg 进行符号文件的初始查找和加载:
(图4)
4. 若要查看 Notepad.exe 模块的符号,请输入以下命令:
(图5)
注意 如果没有看到任何输出,请再次输入 .reload。
若要查看 Notepad.exe 模块中包含 main 的符号,请使用如下所示检查符号命令来列出与掩码匹配的模块:
x notepad!wWin*
输出类似于以下内容:
(图6)
5. 若要在 notepad!wWinMain 处设置断点,输入以下命令:
若要验证是否已设置断点,请输入以下命令:
输出类似于以下内容:
(图7)
bu下断点,bl查看所有断点,然后两个超链接: Disable禁用断用, Clear清除断点
6. 若要启动记事本运行,请输入以下命令:
记事本将一直运行,直到进入“WinMain”函数,然后中断到调试器 。
(图8)
命中上一步我们下的断点WinMain。
若要查看在记事本进程中加载的代码模块列表,请输入以下命令:
输出类似于以下内容:
(图9)
貌似是notepad用到的一些dll
若要查看堆栈跟踪,请输入以下命令:
输出类似于以下内容:
(图10)
7. 若要再次启动记事本运行,请输入以下命令:
(图11)
勇哥按了两次g,notepad跑起来了,这时候windbg的状态显示busy, 无法输入指令了。
8. 若要中断记事本,请从“文件”菜单中选择“中断” 。
(图12)
break指令后,windbg又可以输入指令了。
9. 若要在 ZwWriteFile 设置并验证断点,请输入以下命令 :
(图13)
这里是想在记事本保存文件时断下来,因此要对记事本用到的ntdll模块下断点。
10. 输入 g 重新启动记事本。 在“记事本”窗口中,输入一些文本并从“文件”菜单中选择“保存”。
当遇到 ZwCreateFile 时,正在运行的代码会中断 。 输入 k 以查看堆栈跟踪。
(图14)输入g重启记事本,然后输入文字,“保存”
(图15) 已经命中了断点
(图16)跟踪显示堆栈信息
在 WinDbg 窗口的命令行左侧,注意处理器和线程号。 在本例中,当前处理器号为 0,当前线程号为 11。 因此,我们正在查看线程 11 的堆栈跟踪(它正好在处理器 0 上运行)。
实验到这里,发现windgb状态显示busy,无法输入后面的指令。
菜单中胡乱点几下,windbg的ui失去响应。只能重启windbg再继续后面的第 11条验证。
11. 若要查看记事本进程中所有线程的列表,请输入以下命令(波形符):
输出类似于以下内容:
(图17)
在本例中有 8个线程,索引为 0-7。
Unfrozen应该是线程的状态,非冻结?
这里跟微软文章中说的线程数量不一样(他演示时有14个线程),也许是大家敲入~时记事本的状态不同造成的吧?
12. 若要查看线程 0 的堆栈跟踪,请输入以下命令:
输出类似于以下内容:
(图18)切换线程
这一步是需要时间的,看到状态栏显示busy就耐心等待吧。
(图19)显示跟踪堆栈
这一步也需要时间等待。
那么问题来了?显示这个堆栈信息有什毛用处呢?
我也不知道,等下一篇我们一起继续扫盲吧!
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

