当前位置:首页 > 系统教程 > Win10教程 > 详细页面

Win10系统下WinDBG如何分析转储日志和蓝屏日志

时间:2019-09-10来源:老毛桃一键重装作者:佚名

使用Windows 10相对来说出现蓝屏概率还是很高的,但微软提供的错误代码有时候可能无法帮助我们解决问题。所以我们需要使用更专业的工具来分析系统记录的日志,有日志进行排查后就可以定位到具体什么原因引起蓝屏。说到这上午连续出现两次蓝屏死机严

使用Windows 10相对来说出现蓝屏概率还是很高的,但微软提供的错误代码有时候可能无法帮助我们解决问题。所以我们需要使用更专业的工具来分析系统记录的日志,有日志进行排查后就可以定位到具体什么原因引起蓝屏。说到这上午连续出现两次蓝屏死机严重影响工作,所以必须排查出问题将它彻底解决才行。

 

WinDBG调试工具介绍:

这是微软官方出品的转储日志和内存日志读取分析工具,借助这款工具可以用来读取日志查看其中包含的内容等。转储日志和内存日志格式通常都是.DMP或.DUMP格式的,如果你尝试直接使用记事本打开肯定会直接返回错误。这就是为什么我们需要专业的工具进行排查的原因所在,有调试工具可以用来配合Windows 10事件查看器使用。事件查看器可以提供基本的错误信息,如果从事件查看器中无法判断问题原因那就可以使用WinDBG来分析日志。

 

 

怎么下载WinDBG调试工具:

现在的调试工具微软已不提供独立下载 ,所以需要通过 Windows 10 SDK 套件安装程序手动选择调试程序安装。当然你不需要担心因为 Windows 10 SDK 只是安装程序 ,  可以自由选择安装哪些组件比如我们只安装WinDBG。

Win10 SDK最新版:https://developer.microsoft.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 Redistributable卸载,即可安装成功。

  

WinDBG使用教程:

微软官网提供了详细的使用教程,参考链接:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging

在使用之前,需要完成以下任务

判断哪个设备作为服务系统,那个设备作为客户系统。调试器运行在客户系统,程序运行在服务系统。

判断你将要进行用户态调试还是内核态调试。内核态可以拥有极大的权限,可以访问系统的任何部分,许多核心操作系统功能和硬件驱动运行在内核态。用户态拥有很多限制,只能运行在自己的虚拟内存空间,不能直接访问系统。

关于调试内核态,请参考:

关于调试用户态,请参考:Getting Started with WinDbg (User-Mode).

除此之外,还需要做以下事情:

配置符号表。为了使用WinDbg提供的所有高级功能,必须加载正确的符号表。可以参考:Symbps for Windows debugging (WinDbg, KD, CDB, NTSD)。Windows 调试中的符号表

配置源码。如果你的目标是调试你自己的源代码,你需要配置源码路径。

 

Windows 调试中的符号表

关于符号表

符号表和符号文件

当应用程序,库,驱动,或者操作系统被链接,连接器生成exe文件或dll文件的同时还生成许多额外的文件叫做symbp files.符号文件拥有许多数据,这些数据在运行二进制文件时并不需要,但是在debug过程中非常拥有。通常的,这些数据包含以下信息:

全局变量

局部变量

函数名以及他们实体指针的地址

帧指针表

源代码行数

这些都被成为symbp。例如一个简单的符号文件Myprogram.pdb可能包含上百个符号表。一般来说,软件公司发布两种版本的symbp file,一种是全量symbp file包含全部pubpc symbps和private symbps,另一种简版的文件只包含pubpc symbps。

调试时,必须知道调试器能够获取与调试目标相匹配的symbp files,在线调试和调试crash dump files都需要symbps。

Windows以后缀名pdb保存symbps,vs将所有symbps保存在pdb文件中。

为Debugging获取符号表

设置好symbps是一项充满挑战的任务,特别对于内核态调试来说。它经常需要你知道你电脑产品的所有名字和releases,调试器必须能够定位到每一个产品的symbp file。

为了简化困难,symbps files被收集到一个symbp store,可以通过symbp server获取。一个symbp store 是一个symbps files的集合,是一个索引,是一个管理员添加和删除文件的工具。这些文件通过一些独特的参数被索引,例如时间戳或图像大小。Debugging Tops for Windows contains a symbp store creation top called SymStore. Debugging Tops for Windows contains a symbp server called SymSrv.

配置符号表

微软官网上说的比较委婉,不容易操作。这里直接给出一种简单的设置方法。

将windbg安装目录添加到Path环境变量中。如:C:\Program Files\Debugging Tops for Windows (x64)

新建一个环境变量_NT_SYMBOL_PATH 值为: SRV*c:\mysymbp* http://msdl.microsoft.com/download/symbps

这句话告诉WinDbg,我的symbp文件保存在c:\mysymbp文件夹里,其实里面什么都没有,甚至这个文件夹不存在,不过没关系,系统找不到的话会创建一个,并在上面的网址中去帮你下载符号文件放在里面。

重启计算机

重启计算机后会如果发现C盘多一个mysymbp文件,并且用windbg打开一个exe文件,会看到Symbp search path is: SRV*c:\mysymbp* http://msdl.microsoft.com/download/symbps提示信息,说明配置成功。

注意:进行完此步骤后,如果再次启动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,同时生成一个Helloworld.pdb。

(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 c094 (first chance)

First chance exceptions are reported before any exception handpng.

This exception may be expected and handled.

HelloWorld!MyFunction+0x53:

0001`3f2a16d3 f7bd2801 idiv eax,dword ptr [rbp+128h] ss:`0014f648=

是说发生了0除错误。

(4)!analyze -v

将会生成一堆对错误的分析。

调试notepad

此部分的先决条件是配置好symbp(参考: 配置符号表)。

用windbg打开notepad.exe,通常在C:\Windows\System32,如图:

 

 

运行.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退出调试

分享到:

相关信息

  • Win10系统怎么将控制面板添加到桌面?

    说到控制面板,相信很多人都会使用到。但是平常打开控制面板的步骤,都有点多。而且部分用户觉得开始菜单中没有控制面板,觉得操作不太方便。那么如何将控制面板添加到移到桌面?下面一起来看看具体的操作方法吧! 方法一...

    2019-12-30

  • win10系统如何关闭msiexec.exe进程

    msiexec.exe是windows系统的程序文件,主要是用来给windows安装新程序,当我们使用update安装更新或者安装一些软件的时候,msiexec.exe进程就会出现,而且占用内存比较大,最近有位win10系统用户使用电...

    2019-12-29