首页 > 编程语言 >WinDbg调试Dump转储文件及程序崩溃时自动创建转储文件的方式

WinDbg调试Dump转储文件及程序崩溃时自动创建转储文件的方式

时间:2023-04-06 21:11:38浏览次数:46  
标签:文件 WinDbg Windows 转储 WpfApp4 调试

通过WinDbg分析转储文件

在调试过程中回遇到一些很奇怪的问题,编译器调试无法正常定位问题,所以需要WinDbg,这篇博客是对照多篇文档的简易的入门整理

一、必备知识

1.1、下载WinDbg

微软文档

下载 Windows 调试工具 - WinDbg - Windows drivers | Microsoft Learn

WinDbg Preview 是 WinDbg 的新版本。WinDbg Preview 使用与 WinDbg 相同的基础引擎,因此所有命令、扩展和工作流的运行仍然与从前相同。

文档中有三种下载方式,我使用了应用商店的方式,可以在没有环境的机器上独立使用;

WinDbg Preview - Microsoft Store 应用程序

1.2、WinDbg命令行选项

WinDbg 命令行选项 - Windows drivers | Microsoft Learn

1.3、微软系列文档

使用 WinDbg 进行调试 - Windows drivers | Microsoft Learn

1.4、用户模式转储文件类型

1.5、 完整用户模式转储

完整的用户模式转储_是基本的用户模式转储文件。 完整的用户模式转储文件包括:

  • 进程的整个内存空间。
  • 程序的可执行映像。
  • 句柄表。
  • 其他信息,可帮助调试器在转储发生时重建正在使用的内存。

    1.6、Minidumps

    小型转储文件的大小和内容因要转储的程序、执行转储的应用程序和所选选项而异。 有时,小型转储文件的大小适中,并且包含完整的内存和句柄表。 在其他情况下,小型转储文件要小得多。 例如,小型转储文件可能仅包含有关单个线程的信息,也可能仅包含有关堆栈中引用的模块的信息。

术语 minidump 具有误导性,因为最大的小型转储文件包含的信息比完整的用户模式转储文件更多。

二、在程序崩溃时自动创建dump

\注册表中位置:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
新建REG_DWORD类型、名称为DumpCount的元素值为10;
新建REG_EXPAND_SZ类型、名称为DumpFolder的元素值为%LOCALAPPDATA%\CrashDumps;
DUMP存放位置:C:\Users\duwenlong\AppData\Local\CrashDumps

三、开始使用WinDbg分析mimidumps转储文件

因为项目时间原因,而且这篇不是系列的文章,所以我只记录如何分析转储文件;

启动WinDbg通过从“文件”菜单中选择“打开故障转储”或按 Ctrl+D 打开转储文件。 出现“ 打开故障转储 ”对话框时,在“文件名”框中输入故障转储文件的完整路径和 名称 ,或使用对话框选择正确的路径和文件名。 选择正确的文件后,选择“ 打开”。
等待加载完成:
我创建一个示例程序,点击Button后thow一个异常,下面的命令窗口中输入“!analyze -v”命令,工具就对dump文件进行分析;

可以看到关键报错信息

MethodDesc: 00007ffe75b0b4e8
Method Name: WpfApp4.MainWindow.Button_Click(System.Object, System.Windows.RoutedEventArgs)
Class: 00007ffe75af6d98
MethodTable: 00007ffe75b0b5c8
mdToken: 0000000006000009
Module: 00007ffe756f68d8
IsJitted: yes
Current CodeAddr: 00007ffe75d76530
Version History:
ILCodeVersion: 0000000000000000
ReJIT ID: 0
IL Addr: 00000226d51a20e4
CodeAddr: 00007ffe75d76530 (MinOptJitted)
NativeCodeVersion: 0000000000000000
Source file: D:\demo\WpfApp4\WpfApp4\MainWindow.xaml.cs @ 32

下面还有关键的代码位置信息

STACK_COMMAND: ~0s; .ecxr ; kb

FAULTING_SOURCE_LINE: D:\demo\WpfApp4\WpfApp4\MainWindow.xaml.cs

FAULTING_SOURCE_FILE: D:\demo\WpfApp4\WpfApp4\MainWindow.xaml.cs

FAULTING_SOURCE_LINE_NUMBER: 32

FAULTING_SOURCE_CODE:  
    28:         private void Button_Click(object sender, RoutedEventArgs e)
    29:         {
    30:             var f = 0;
    31:             var g = 0;
    32:             var gfg = f / g;
    33:         }
    34:     }
    35: }

这里能初步的看到NET的崩溃问题,代码位置;

有一些常用的指令类型

  • 常规指令,控制被调试程序: kv, g, lm, dds等
  • 元指令,控制调试器: .sympath, .cls
  • 扩展指令: !anlayze, !teb, !handle

定位错误

  • .ecxr 指令 定位到当前异常的上下文
  • !anlayze -v 可以让调试器自动分析得到基本的异常信息

但是虽然我也是.NET但是崩问题发生时有时候不是在.NET内的。所以上面的例子其实看不到问题点,还是很麻烦。

找了很久发现.NET的话买本《.NET高级调试》系统的学习一下,比较好。这篇博客就写这么多。后续会整理《.NET高级调试》学习笔记。

标签:文件,WinDbg,Windows,转储,WpfApp4,调试
From: https://www.cnblogs.com/duwenlong/p/17294166.html

相关文章

  • 报错:‘VUE-CLI-SERVICE‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    启动前端的项目,命输入npmrundev时,报错:'vue-cli-service'不是内部或外部命令,也不是可运行的程序或批处理文件。如图:1、管理员身份打开 2.输入set-ExecutionPolicyRemoteSigned 3、选择A4、Pycharm-Terminal执行命令:npminstall需要安装一会儿,稍安勿躁,安装完成......
  • Spartacus 项目中的 facade 和 core 文件夹
    Spartacus是SAPCommerceCloud的storefront框架,feature-libs文件夹下的facade文件夹和core文件夹是Spartacus中用于实现特定功能的库文件夹。它们各自的作用如下:facade文件夹:存放与storefront框架中的各种功能和业务逻辑相关的代码。这些代码通过facade模式......
  • Springboot+HTML5+Layui2.7.6上传文件【请求上传接口出现异常】
    1.最近两天在springboot+html5项目中发现在用layui框架时报请求上传接口出现异常这个错误。2.将代码全部整理了一遍,发现前端后台都没错!!!但是还是【请求上传接口出现异常】,于是跑去翻看layui官网。 3.最终最终将错误锁定到了返回的JSON字符串中,我是返回的String,所以一直都会......
  • 管理WEB服务器文件的WebDAV协议&HTTP大跃进--QUIC与HTTP30&WEB安全攻击概述
    管理WEB服务器文件的WebDAV协议WebADV协议    WEBDAV追加方法  WeDAV请求示例  HTTP大跃进--QUIC与HTTP30 QUIC&HTTP3.0   HTTP2.0的问题队头阻塞建立连接的握手延迟大QUIC的特性0RTT   没有队头阻塞的多路复用 ......
  • FolderBrowserDialog类实现选择打开文件
    privatevoidbutton1_Click(objectsender,EventArgse){FolderBrowserDialogdilog=newFolderBrowserDialog();dilog.Description="请选择文件夹";if(dilog.ShowDialog()==DialogResult.OK||dilog.ShowDialo......
  • c# 获取当前文件路径
    Winform获取应用程序的当前路径的方法集合,具体如下://获取当前进程的完整路径,包含文件名(进程名)。stringstr=this.GetType().Assembly.Location;result:X:\xxx\xxx\xxx.exe(.exe文件所在的目录+.exe文件名)//获取新的Process组件并将其与当前活动的进程关联的主......
  • c#.net怎么实现web端上传超大文件
    ​ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。ASP.NET页面设计:TextBox和Button按钮。​编辑TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实......
  • OneDrive实现电脑文件分享与协同
      本文介绍基于OneDrive网盘实现电脑大文件共享、协同办公的方法。1前言  作为网盘的重度用户,在学习、工作、生活中可以说少不了与各类云盘打交道。在这一过程中,也慢慢了解到不同网盘软件的特点,从而逐渐结合其各自的特点,在不同的应用场合选择不同的网盘软件。  在日常运......
  • PDF打开后显示的名称不是其文件名怎么办?
      本文介绍打开PDF文件时,PDF阅读器所显示的文件名称与文件实际名称不一致的解决办法。  就在刚刚准备一篇空间三维建模相关的博客时,偶然发现了如下一个问题:  在打开这个图中名称为空间三维建模_操作.pdf的PDF文件后,在PDF阅读器中其题目却变成了另一个名称:  没错,由原......
  • Linux下使用rm删除文件,并排除指定文件
    rm是我们在Linux下删除文件经常用到的命令,但是有时候我们目录下有很多个文件想要删除,偏偏却要保留其中1个或几个文件,那怎么办呢?很多新手朋友可能会采取一个一个文件删除的方法来操作,但是如果文件很多呢?删到啥时候啊~~ 今天我们就来教大家使用rm命令删除文件的时候如何排除指定......