WinDbg 入门一:(用户模式),调试记事本

勇哥注:

最近开发的软件遇到一些问题,主要是爆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

  1. 导航到安装目录,然后打开 WinDbg.exe。

  2. 在“文件”菜单上,选择“打开可执行文件” 。

    在“打开可执行文件”对话框中,导航到包含 notepad.exe 的文件夹(通常是 C:\Windows\System32)。 输入 notepad.exe 作为“文件名称” 。 选择“打开”。


image.png

(图1) 


图1是勇哥win10电脑上,打了win10sdk补丁后的windbg 64位版本,奇怪的是微软文章中的windbg是图2这样的。

也许是执行目录下另有一个exe。

image.png

(图2)





3. 在 WinDbg 窗口底部的命令行中,输入以下命令:

.sympath srv*

输出类似于以下内容:

image.png

(图3)


符号搜索路径指示 WinDbg 查找符号 (PDB) 文件的位置。 调试器需要符号文件来获取有关代码模块的信息(函数名、变量名等)。

输入此命令,它会通知 WinDbg 进行符号文件的初始查找和加载:

.reload

image.png

(图4)

4.  若要查看 Notepad.exe 模块的符号,请输入以下命令:

x notepad!*

image.png

(图5)


注意 如果没有看到任何输出,请再次输入 .reload

若要查看 Notepad.exe 模块中包含 main 的符号,请使用如下所示检查符号命令来列出与掩码匹配的模块:

x notepad!wWin*

输出类似于以下内容:


image.png

(图6)



5. 若要在 notepad!wWinMain 处设置断点,输入以下命令:

bu notepad!wWinMain

若要验证是否已设置断点,请输入以下命令:

bl

输出类似于以下内容:

image.png

(图7) 

bu下断点,bl查看所有断点,然后两个超链接: Disable禁用断用, Clear清除断点



6. 若要启动记事本运行,请输入以下命令:

g

记事本将一直运行,直到进入“WinMain”函数,然后中断到调试器 。


image.png

(图8)

命中上一步我们下的断点WinMain


若要查看在记事本进程中加载的代码模块列表,请输入以下命令:

lm

输出类似于以下内容:

image.png

(图9)

貌似是notepad用到的一些dll


若要查看堆栈跟踪,请输入以下命令:

k

输出类似于以下内容:

image.png

(图10)


7. 若要再次启动记事本运行,请输入以下命令:

g

image.png

(图11)

勇哥按了两次g,notepad跑起来了,这时候windbg的状态显示busy, 无法输入指令了。


8. 若要中断记事本,请从“文件”菜单中选择“中断” 。

image.png

(图12)

break指令后,windbg又可以输入指令了。


9. 若要在 ZwWriteFile 设置并验证断点,请输入以下命令 :

bu ntdll!ZwWriteFile

bl

image.png

(图13)

这里是想在记事本保存文件时断下来,因此要对记事本用到的ntdll模块下断点。


10. 输入 g 重新启动记事本。 在“记事本”窗口中,输入一些文本并从“文件”菜单中选择“保存”。 

当遇到 ZwCreateFile 时,正在运行的代码会中断 。 输入 k 以查看堆栈跟踪。

image.png

(图14)输入g重启记事本,然后输入文字,“保存”


image.png

(图15) 已经命中了断点

image.png

(图16)跟踪显示堆栈信息

在 WinDbg 窗口的命令行左侧,注意处理器和线程号。 在本例中,当前处理器号为 0,当前线程号为 11。 因此,我们正在查看线程 11 的堆栈跟踪(它正好在处理器 0 上运行)。


实验到这里,发现windgb状态显示busy,无法输入后面的指令。

菜单中胡乱点几下,windbg的ui失去响应。只能重启windbg再继续后面的第 11条验证。


11. 若要查看记事本进程中所有线程的列表,请输入以下命令(波形符):

~

输出类似于以下内容:

image.png

(图17)

在本例中有 8个线程,索引为 0-7。

Unfrozen应该是线程的状态,非冻结?

这里跟微软文章中说的线程数量不一样(他演示时有14个线程),也许是大家敲入~时记事本的状态不同造成的吧?


12. 若要查看线程 0 的堆栈跟踪,请输入以下命令:

~0s

k

输出类似于以下内容:


image.png

(图18)切换线程

这一步是需要时间的,看到状态栏显示busy就耐心等待吧。


image.png

(图19)显示跟踪堆栈

这一步也需要时间等待。


那么问题来了?显示这个堆栈信息有什毛用处呢?

我也不知道,等下一篇我们一起继续扫盲吧!




--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年5月    »
12345
6789101112
13141516171819
20212223242526
2728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864