windbg是一个内核模式和用户模式调试器,包含在Windows调试工具中。在这里,提供个实践练习,帮助咱们开始使用windbg做为用户模式调试器。windows
一、导航到安装目录,而后打开windbg.exe。app
二、在“文件”菜单上,选择“打开可执行文件”。在“打开可执行文件”对话框中,导航到包含notepad.exe的文件夹(例如,C:\windows\system32)。输入notepad.exe做为“文件名”。单击“打开”。函数
三、在windbg窗口底部附近的命令行中,输入如下命令:.sympath srv*.工具
输出:spa
符号搜索路径告诉windbg在哪里查找符号(pdb)文件。调试器须要符号文件来获取有关代码模块(函数名、变量名等)的信息。
输入此命令,通知windbg执行符号文件的初始查找和加载:.reload命令行
四、查看notepad.exe模块的符号线程
请输入如下命令:x notepad!*debug
注意:若是看不到任何输出,请输入.reload。要查看包含main的notepad.exe模块中的符号,请输入如下命令: x notepad!*main*调试
五、在记事本上设置断点notepad!WinMain,输入如下命令:bu notepad!WinMaincode
要验证是否设置了断点,请输入如下命令:bl
六、运行,请输入如下命令:g
记事本一直运行到winmain函数,而后中断到调试器。
要查看在记事本进程中加载的代码模块列表,请输入如下命令:lm
要查看堆栈跟踪,请输入如下命令:k
七、再次运行 g
八、要中断记事本执行,请从“调试”菜单中选择“中断”。
九、观察保存过程,要在zwwritefile处设置和验证断点,请输入如下命令:
十、输入g从新开始运行记事本。在记事本窗口中,输入一些文本,而后从“文件”菜单中选择“保存”。当涉及zwCreateFile时,正在运行的代码将中断。输入k以查看堆栈跟踪。
void MyFunction(long p1, long p2, long p3) { long x = p1 + p2 + p3; long y = 0; y = x / p2; } void main () { long a = 2; long b = 0; MyFunction(a, b, 5); }
对于本练习,咱们假设构建的应用程序(myapp.exe)和符号文件(myapp.pdb)位于C:\myapp\x64\debug中。咱们还将假设应用程序源代码位于C:\myapp\myapp中。
一、打开Windbg
二、在“文件”菜单上,选择“打开可执行文件”。在“打开可执行文件”对话框中,导航到c:\myapp\x64\debug。输入myapp.exe做为“文件名”。单击“打开”。
三、输入下面的命令:
.sympath+ C:\MyApp\x64\Debug
如今,windbg知道在哪里能够找到应用程序的符号和源代码。
四、输入下面的命令:
五、在“调试”菜单上,选择“单步执行”(或按F11)。继续单步执行,直到进入MyFunction。当您单步执行y=x/p2行时,应用程序将崩溃并进入调试器。输出与此相似: