使用Windows 10出现蓝屏的概率相对较高,但微软提供的错误代码有时可能无法帮助我们解决问题。所以我们需要使用更专业的工具来分析系统记录的日志。
检查日志后,您可以找到蓝屏的具体原因。说起这个调试工具,鸭哥早上连续两次出现蓝屏死机的情况,严重影响了他的工作,所以他必须找出问题并彻底解决。
WinDBG调试工具介绍:
这是一个官方工具,用于读取和分析微软生产的转储日志和内存日志。使用这个工具,您可以读取日志并检查其内容。转储日志和内存日志通常在。DMP或者。转储格式。
如果你试图直接用记事本打开它,你肯定会直接返回一个错误。这就是为什么我们需要专业的故障排除工具。有一些调试工具可以与Windows 10事件查看器一起使用。事件查看器可以提供基本的错误信息,
如果无法从事件查看器中确定问题的原因,可以使用WinDBG来分析日志。
如何下载WinDBG调试工具:
现在的调试工具微软不提供独立下载,所以需要通过Windows 10 SDK套件安装程序手动选择调试程序进行安装。
当然,您不需要担心,因为Windows 10 SDK只是一个安装程序,您可以自由选择安装哪些组件。比如我们只安装WinDBG。
Win10 SDK最新版:https://开发商。微软。com/zh-cn/windows/downloads/windows-10-SDK
下载后直接打开Windows 10 SDK安装程序然后取消选择它,并保留调试工具Debugging Tools for Windows。注意不要安装其他不必要的工具,否则您将需要下载大量的安装文件。
其他工具可根据您的实际需要选择和安装。安装后,可以在Windows 10开始菜单的Windows Kits文件夹中找到WinDBG调试工具,打开后就可以使用该调试工具了。
调试工具功能丰富,有点门槛。本文只介绍下载和安装,后面会介绍使用xttd的具体步骤。
WinDBG安装教程:
安装完成后,您可以在Windows开始菜单栏中找到Windbg。
安装可能会失败。如果安装失败,您可以在“面板制作程序和功能”中卸载Microsoft Visual C 2010 re distributable,安装将会成功。
WinDBG使用教程:
参考链接:https://份文件。微软。com/en-us/windows-hardware/drivers/debugger/get-with-windows-debugging
使用前,您需要完成以下任务。
确定哪个设备用作服务系统,哪个设备用作客户端系统。调试器运行在客户系统中,程序运行在服务系统中。
确定您是要在用户模式还是内核模式下进行调试。内核模式可以拥有很大的权限并访问系统的任何部分,许多核心操作系统功能和硬件驱动程序都在内核模式下运行。用户模式有很多限制,只能在自己的虚拟内存空间中运行。
无法直接访问系统。
有关调试内核状态的信息,请参考:
For debugging user mode, please refer to: Getting Started with WinDbg (User Mode).
此外,还需要做以下事情:
配置符号表。为了使用WinDbg提供的所有高级功能,必须加载正确的符号表。您可以参考SYMbps进行Windows调试(WindBG、KD、CDB、NTSD)。
Windows调试中的符号表
配置源代码。如果您的目标是调试自己的源代码,则需要配置源代码路径。
Windows调试中的符号表
在符号表上
符号表和符号文件
当应用程序、库、驱动程序或操作系统被链接时,连接器会生成一个exe文件或dll文件,同时,它还会生成许多称为symbp文件的附加文件。符号文件有很多数据,运行二进制文件时不需要这些数据。
调试它在调试过程中很有主见。通常,这些数据包含以下信息:
全局变量
局部变量
函数名及其实体指针的地址。
帧指针表
源代码行
这些被称为symbp。例如,一个简单的符号文件Myprogram.pdb可能包含数百个符号表。一般来说,软件公司发布两个版本的symbp文件。
一个是全尺寸的symbp文件包含所有的pub PC symbp和私有symbp,另一个是短版本文件只包含pub PC symbp。
调试时,您必须知道调试器可以获得与调试目标匹配的symbp文件,并且在线调试和调试崩溃转储文件都需要symbp。
Windows以后缀pdb保存symp,VS将所有symp保存在pdb文件中。
获取用于调试的符号表
设置symbps是一项具有挑战性的任务,尤其是对于内核状态调试。它通常要求您知道计算机产品的所有名称和版本,并且调试器必须能够找到每个产品的symbp文件。
Debugging Tops for Windows contains a symbp store creation top called SymStore. Debugging Tops for Windows contains a symbp server called SymSrv.
配置符号表
微软官网说的很委婉,不好操作。下面直接介绍一个简单的设置方法。
Add the windbg installation directory to the path environment variable. Such as: c: program file debugging Tops(x64) for Windows.
新建一个环境变量_NT_SYMBOL_PATH值为:SRV * c:mysymbp * http://msdl.microsoft.com/download/symbps
这句话告诉WinDbg,我的symbp文件存储在文件夹c:mysymbp中,但里面什么都没有,甚至这个文件夹不存在,但这无关紧要。如果系统找不到它,它将创建一个并在上面的URL中为您下载符号文件。
重新启动计算机
重启电脑后,如果发现c盘上多了一个mysymbp文件,用windbg打开一个exe文件,
You will see that the Symbp search path is: SRV * c: mysymbp * http://msdl.microsoft.com/download/symbps prompt, indicating that the configuration is successful.
注意:进行完此步骤后,如果再次启动VS,VS会读取_NT_SYMBOL_PATH环境变量并且从中下载并读取symbp,这会造成VS启动调试非常缓慢,
建议不用Windbg时可以将_NT_SYMBOL_PATH换个名字。
Debugger如何识别符号表
调试中的符号问题
用户态调试入门
调试自己的程序
假设你已经编写如下程序
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);}(1)用Visual studio 2015在x64、debug模式下生成一个Helloworld.exe,
(2)将Helloworld.pdb拷贝到设置的本地symbp文件夹中(参考:配置符号表)。
(3)用windbg打开Helloworld.exe和Helloworld.cpp。
接着就可以输入调试命令进行输入了,例如:
bu HelloWorld!main
意思是在HelloWorld的main模块处设置断点
g
开始运行程序
按F11进行单步调试,直到程序运行到y=x/p2将会崩溃,输出错误信息,类似这样:
(3058.3830): Integer divide-by-zero - code c0000094 (first chance)
First chance exceptions are reported before any exception handpng.
This exception may be expected and handled.
HelloWorld!MyFunction+0x53:
00000001`3f2a16d3 f7bd28010000 idiv eax,dword ptr [rbp+128h] ss:00000000`0014f648=00000000
是说发生了0除错误。
(4)!analyze -v
将会生成一堆对错误的分析。
调试notepad
此部分的先决条件是配置好symbp(参考: 配置符号表)。
用windbg打开notepad.exe,通常在C:WindowsSystem32,如图:
运行.reload,寻找并且加载symbps
x notepad!WinMain
寻找所有与WinMain匹配的symbps。
bu notepad!WinMain 设置断点
bl 显示已经设置的断点信息
g 运行程序直到断点、崩溃或程序结束
lm 显示notepad程序已经加载的模块
k显示当前线程的堆栈轨迹,即函数调用结构表
g 继续运行
按菜单栏的stop按钮停止调试
bu ntdll!ZwWriteFile 设置新的断点
bl 显示断点信息
~ 查看当前程序的所有线程
~0s
k
以上两个命令可以进入0好进程,并查看堆栈轨迹
qd退出调试