安装好windbg后,我们就要开始使用这个强大的工具去解决我们的问题,而不是使其像一个花瓶一样摆在桌面。同时,一个工具的知识有千方百面,我想几乎没有人可以完全百分百地从广度到深度精通该工具的所有方面。所以,我们拿到一个工具,应该先可以很快捷地使用起来,遇到需要深度或者难点时,再去搜索或者阅读文档来解决。
windbg也一样。作为一个调试工具,一个用户肯定首先希望了解怎样打开可执行文件(*.exe);怎么关联到源文件好方便查看源代码;怎么加载符号文件(*.pdb);怎么设置断点;怎么查看调用堆栈......这篇文章可以图文并茂地回答上面的小问题,让我们开始在实际中使用windbg。
1. windbg是带有GUI的windows应用程序,可以直接从桌面双击打开。
2. 我们使用系统自带的notepad作demo,点击"Open Executable",选择路径C:\Windows\System32,再选择notepad.exe打开。
3. windbg作为调试工具,需要知道去哪里查找符号文件。用户可以灵活设置,在窗口的底端命令行(0:000),输入命令.sympath srv*
0:000> .sympath srv* Symbol search path is: srv* Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols ************* Path validation summary ************** Response Time (ms) Location Deferred srv*
上面的输出设置了符号表的搜索路径,告诉windbg在微软的符号服务器去加载搜索符号表。然后输入.reaload命令,告诉windbg开始初始查找和加载符号文件。
4. 查看notepad.exe的符号表,可以输入命令"x notepad!*";如果没有任何输出,可以重新执行".reload"命令。
如果想查看包含main的模块,使用命令"x notepad!*main*",输出如下:
5. 设置断点和查看断点列表。使用"bu notepad!WinMain"在WinMain设置断点,并通过"bl"命令查看断点列表。
windbg设置断点的功能非常强大,可以设置不同的断点,也可以根据行数,文件名,函数名等不同方式设置,相关的内容会在后续的文章中详细说明。
6. 现在该启动notepad,输入命令"g"启动,直到遇到断点停下。要查看加载的代码模块列表,使用命令"lm";
7. 查看call stack,输入"k";
8. 列出在notepad进程中所有的线程,使用命令"~";并输入"~0s"切换到线程0,然后可以查看调用堆栈;
9. 退出调试,detach进程,输入命令"qd"。