Dump文件的生成以及使用WinDbg静态分析

news2025/1/23 21:31:44

前言

  • 本文章主要介绍了如何生成Dump文件,包括两种方式,通过代码生成和通过注册表生成。并且介绍了WinDbg工具的下载和使用,以及如何使用WinDbg工具去静态分析Dump文件,从而找到程序的崩溃位置。

生成Dump文件

  • 通过调用WinAPI生成 SetUnhandledExceptionFilter

    • 接口说明
      •   LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
          	[in] LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
          );
        
    • 参数
      • [in] lpTopLevelExceptionFilter
      • 指向顶级异常筛选器函数的指针,每当 UnhandledExceptionFilter 函数得到控制时,都会调用该函数,并且进程不会被调试。 此参数的 NULL 值指定 UnhandledExceptionFilter 中的默认处理。
      • 筛选器函数的语法与 UnhandledExceptionFilter 的语法类似:它采用类型 为 LPEXCEPTION_POINTERS 的单个参数,具有 WINAPI 调用约定,并返回 LONG 类型的值。 筛选器函数应返回以下值之一。
      • Value含义
        EXCEPTION_EXECUTE_HANDLER 0x1从 UnhandledExceptionFilter 返回并执行关联的异常处理程序。 这通常会导致进程终止
        EXCEPTION_CONTINUE_EXECUTION 0xffffffff从 UnhandledExceptionFilter 返回,并从异常点继续执行。 请注意,筛选器函数可通过修改通过其 LPEXCEPTION_POINTERS 参数提供的异常信息来自由修改延续状态。
        EXCEPTION_CONTINUE_SEARCH 0x0继续执行 UnhandledExceptionFilter 的正常执行。 这意味着遵守 SetErrorMode 标志,或调用应用程序错误弹出消息框。
    • 返回值
      • SetUnhandledExceptionFilter 函数返回使用函数建立的上一个异常筛选器的地址。 NULL 返回值表示没有当前的顶级异常处理程序。
    • 注解
      • 发出 SetUnhandledExceptionFilter 会替换调用过程中所有现有线程和所有未来线程的现有顶级异常筛选器。
      • lpTopLevelExceptionFilter 指定的异常处理程序在导致错误的线程上下文中执行。 这可能会影响异常处理程序从某些异常(如无效堆栈)恢复的能力。
    • 参考
    • 测试代码
    •   #include <windows.h>
        #include <stdio.h>
        #include <DbgHelp.h>
        
        #pragma comment(lib, "dbghelp.lib")
        
        
        long __stdcall callback(_EXCEPTION_POINTERS* excp)
        {
        	//创建dump文件
        	HANDLE hDumpFile = CreateFile(L"fileDump_20230902.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        	
        
        	MINIDUMP_EXCEPTION_INFORMATION dumpinfo;
        	dumpinfo.ExceptionPointers = excp;
        	dumpinfo.ThreadId = GetCurrentThreadId();
        	dumpinfo.ClientPointers = true;
        
        	//写入dump文件
        	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpinfo, NULL, NULL);
        
        	CloseHandle(hDumpFile);
        
        	return EXCEPTION_CONTINUE_SEARCH;
        }
        
        void myfunc() {
        	printf("join to myfunc...\n");
        
        	//这里程序会崩溃
        	char* p = NULL;
        	memcpy(p, "hello word", strlen("hello word"));
        
        	printf("end myfunc");
        }
        
        void myMath(int a, int b) {
        	int sum = 0;
        	sum = a + b;
        	printf("sum = %d\n", sum);
        
        	myfunc();
        
        	int minus = 0;
        	minus = a - b;
        	printf("sum = %d\n", sum);
        }
        
        int main() {
        	// 捕获异常
        	SetUnhandledExceptionFilter(callback);
      
        	myMath(10, 20);
        	system("pause");
        	return 0;
        }
      
    • 直接执行程序,就会在你指定的目录下生成对应的dump文件。我是在当前目录下,创建了一个fileDump_20230902.dmp的文件,可以看到,执行程序后,就自动生成了。
      在这里插入图片描述
  • 通过注册表生成

    • 除了通过代码来生成dump文件,我们还可以直接修改注册表,来生成dump文件。

    • 在注册表以下位置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps,创建一个项 DumpFile.exe,项名字和你可执行程序名字保持一致就行。 然后在对应的项中创建三个值,值的类型和说明参考下图。然后执行以上程序,就会在 DumpFolder 值指定的目录下生成一个dump文件。
      请添加图片描述

    • 可以参考下我写的,执行程序崩溃后,就会在这里DumpFolder指定的目录下生成对应的dump文件。
      在这里插入图片描述

    • 参考

    • 测试代码

    •   #include <windows.h>
        #include <stdio.h>
        
        
        void myfunc(){
        	printf("join to myfunc...\n");
        
        	//这里程序会崩溃
        	char* p = NULL;
        	memcpy(p, "hello word", strlen("hello word"));
        
        	printf("end myfunc");
        }
        
        void myMath(int a, int b){
        	int sum = 0;
        	sum = a + b;
        	printf("sum = %d\n", sum);
        
        	myfunc();
        
        	int minus = 0;
        	minus = a - b;
        	printf("sum = %d\n", sum);
        }
        
        int main(){
        	myMath(10, 20);
        	system("pause");
        	return 0;
        }
      
    • 执行程序,可以看到,在指定目录下也生成了一个dump文件
      在这里插入图片描述

WinDbg下载与安装

  • 下载地址
  • 点击 Transferir o instalador 下载,下载完成后是一个 winsdksetup.exe 安装包。双击进行安装。
    在这里插入图片描述
  • 上面是在线安装,选择下面,先把WinDbg安装包下载到本地。
  • 在这个界面,只选择 Debugging Tools for Windows 就可以了。
    在这里插入图片描述
  • 下载完成后,对应目录下会有一个 Installers 目录,进去可以选择32位的安装包进行安装 X86 Debuggers And Tools-x86_en-us.msi
  • 这个安装包是没有安装向导的,直接双击就安装好了。在windows开始菜单栏,找到Windows Kits,下面就有安装好的WinDbg
    在这里插入图片描述
  • 双击打开后,是这个界面。安装就完成了。
    在这里插入图片描述

WinDbg静态分析dump

  • 我们打开winDbg,直接把dump文件托进来,就可以进行分析了。
  • 分析异常类型
    • 首先可以先分析是哪种异常,主要有以下三种
      • Access violation: 内存访问违规
      • Integer divided by zero: 除0异常
      • Stack overflow: 线程栈溢出
    • 直接把dump文件托进来,就可以看到异常类型,是内存访问违规
      在这里插入图片描述
  • 使用.ecxr命令查看异常
    • 在下面命令框,输入.ecxr 命令, 可以切换刀发生异常的线程中,并且可以查看发生异常的汇编指令。
      在这里插入图片描述
    • 这里分析需要懂一些汇编的知识,大概可以分析出,MOV是传送的意思,把指针指向一个寄存器EDI中,寄存器的地址是000000,这个地址是不允许用户访问的,因此程序会崩溃。不懂汇编也没关系,可以跳过这一步,继续往下分析。
  • 使用kn/kv/kp 查看函数调用堆栈
    • kn命令表示把发生崩溃的函数堆栈打印出来。
      在这里插入图片描述
    • 这里感叹号前面代表的是模块名,可以看到最上面是崩溃到了 vcruntime140d这个模块中了,这个大家应该都知道,是c的一个运行时库,memcpy函数就在这个库中,后面还会显示具体的行号信息。
    • 可以点击前面的序号,直接可以看到变量值
      在这里插入图片描述
    • 这里还可以通过 File->Source File Path将源代码路径加载进去。双击后面的文件名,就可以在WinDbg中看到对应的源代码了。点击不同的序号,可以跳到对应的位置
      在这里插入图片描述
    • kv和kp命令可以将函数的参数信息也打印出来,可以对比看下
      在这里插入图片描述
    • kv和kp的区别是,kv的参数是以十六进制显示的,且最多显示三位,没有的参数位置,值是无效的
      在这里插入图片描述
    • 我们如果要查看参数,一般直接用kp命令就可以了。
  • 使用lm vm命令查看pdb文件
    • 使用 lm vm 模块名 命令可以看到对应模块的pdb文件。如果找不到pdb文件,我们要手动加进来。
      在这里插入图片描述
    • 可以通过File->Symbol Search Path 将pdb文件所在路径加载进来。
    • 上面的例子,因为是在开发机上调试的,默认是已经加载了pdb文件,如果不是开发机,我们需要手动添加下pdb文件路径,这样才能看到具体的行号信息。
    • 比如我们换一个非开发机,查看堆栈信息,测试程序的函数名和行号信息已经看不到了
      在这里插入图片描述
    • 使用lm vm 模块名命令,看不到pdb文件。
      在这里插入图片描述
    • 这个时候就需要将我们程序的pdb文件拷贝到非开发机上,然后把pdb文件所在路径加载进去,重新执行 .ecxr,再执行kn命令,就可以重新显示函数和行号信息了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/965822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WGCNA分析教程 | 代码四

写在前面 WGCNA的教程&#xff0c;我们在前期的推文中已经退出好久了。今天在结合前期的教程的进行优化一下。只是在现有的教程基础上&#xff0c;进行修改。其他的其他并无改变。 前期WGCNA教程 WGCNA分析 | 全流程分析代码 | 代码一 WGCNA分析 | 全流程分析代码 | 代码二 …

论文阅读_扩散模型_DDPM

英文名称: Denoising Diffusion Probabilistic Models 中文名称: 去噪扩散概率模型 论文地址: http://arxiv.org/abs/2006.11239 代码地址1: https://github.com/hojonathanho/diffusion &#xff08;论文对应代码 tensorflow&#xff09; 代码地址2: https://github.com/AUTOM…

Linux图形栈入门概念

Mesa在图形栈中的位置 游戏引擎&#xff1a; 游戏引擎指的是一种软件框架&#xff0c;通过编程和各种工具&#xff0c;帮助开发者设计、构建和运行视频游戏。它相当于一个虚拟的世界创造工具&#xff0c;提供了各种功能模块和资源&#xff0c;如渲染引擎、物理引擎(碰撞检测、重…

跨模态可信感知

文章目录 跨模态可信感知综述摘要引言跨协议通信模式PCP网络架构 跨模态可信感知跨模态可信感知的概念跨模态可信感知的热点研究场景目前存在的挑战可能改进的方案 参考文献 跨模态可信感知综述 摘要 随着人工智能相关理论和技术的崛起&#xff0c;通信和感知领域的研究引入了…

【网络编程上】

目录 一.什么是互联网 1.计算机网络的定义与分类&#xff08;了解&#xff09; &#xff08;1&#xff09;计算机网络的定义 &#xff08;2&#xff09;计算机网络的分类 ① 按照网络的作用范围进行分类 ②按照网络的使用者进行分类 2.网络的网络 &#xff08;理解&#xf…

OpenCV模块介绍

其中core、highgui、imgproc是最基础的模块&#xff0c;该课程主要是围绕这几个模块展开的&#xff0c;分别介绍如下: core模块实现了最核心的数据结构及其基本运算&#xff0c;如绘图函数、数组操作相关函数。 highgui模块实现了视频与图像的读取、显示、存储等接口。 imgp…

Redis未授权访问漏洞复现

Redis 简单使用 Redis 未设置密码&#xff0c;客户端工具可以直接链接。 Redis 是非关系型数据库系统&#xff0c;没有库表列的逻辑结构&#xff0c;仅仅以键值对的方式存储数据。 先启动容器 Redis 未设置密码&#xff0c;客户端工具可以直接链接 https://github.com/xk11z/…

windows无法连接到无线网络怎么办 windows无线网络连接不上的解决方法

windows无法连接到无线网络怎么办&#xff1f;一般出现这种问题的都是笔记本电脑&#xff0c;笔记本找不到无线网络也就相当于不能上网&#xff0c;今天小编要为大家带来的就是windows无线网络连接不上的解决方法&#xff0c;一共有五种解决教程&#xff0c;有需要的可以来看看…

7.6 函数的递归调用

直接调用&#xff1a; ### 1. 直接递归调用 直接递归调用是指一个函数直接调用自己。例如&#xff0c;计算阶乘的函数&#xff0c;可以使用递归方法&#xff1a; int factorial(int n) {if (n < 1) {return 1;}return n * factorial(n - 1); } 在这个例子中&#xff0c;f…

2021年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:电话号码 给你一些电话号码,请判断它们是否是一致的,即是否有某个电话是另一个电话的前缀。比如: Emergency 911 Alice 97 625 999 Bob 91 12 54 26 在这个例子中,我们不可能拨通Bob的电话,因为Emergency的电话是它的前缀,当拨…

Java object类

一、JDK类库的根类:obiect 1、这个类中的方法都是所有子类通用的。任何一个类默认继承object。就算没有直接继承&#xff0c;最终也会间接继承。 2、obiect类当中有哪些常用的方法?我们去哪里找这些方法呢? 第一种方法:去源代码当中。(但是这种方式比较麻烦&#xff0c;源代…

重写 UGUI

重写Button using UnityEngine; using UnityEngine.UI; public class MyButton : Button {[SerializeField] private int _newNumber; }using UnityEditor;//编辑器类在UnityEditor命名空间下。所以当使用C#脚本时&#xff0c;你需要在脚本前面加上 "using UnityEditor&q…

Hamilton力学的辛算法简介

Hamilton力学的辛算法简介冯康我的熟人和我 都是曾经要死要活的人我的朋友和我 都是正在要死要活的人 外微分形式与辛几何 外微分形式 1-形式2-形式闭2-形式&#xff08;辛构造&#xff09; Euclid Space 符合如下内积定义的线性空间V称为Euclid空间 对称性 (a, b) (b, a)线…

大数据面试题:MapReduce压缩方式

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;1&#xff09;Hadoop常见的压缩算法有哪些&#xff1f; 问过的一些公司&#xff1a;网易云音乐(2022.11)&#xff0c;阿里(2020.…

【GAMES202】Real-Time Global Illumination(screen space)1—实时全局光照(屏幕空间)1

一、Real-Time Global Illumination(in 3D cont.) 上篇只介绍了RSM&#xff0c;这里我们还会简要介绍另外两种在3D空间中做全局光照的方法&#xff0c;分别是LPV和VXGI。 1.Light Propagation Volumes (LPV) 首先我们知道Radiance在传播过程中是不会被改变的&#xff0c;这点…

9.3-day3-Don‘t let desire break through your will

你这个年龄 是站在阳光下都会发光的年纪 “岂能被欲望所控制”

Shell-AI:基于LLM实现自然语言理解的CLI工具

一、前言 随着AI技术的普及&#xff0c;部分技术领域的门槛逐步降低&#xff0c;比如非科班出身&#xff0c;非技术专业&#xff0c;甚至从未涉足技术领域&#xff0c;完全不懂服务器部署和运维&#xff0c;如今可以依托AI大模型非常轻松的掌握和使用相关技术&#xff0c;来解…

简单了解ICMP协议

目录 一、什么是ICMP协议&#xff1f; 二、ICMP如何工作&#xff1f; 三、ICMP报文格式 四、ICMP的作用 五、ICMP的典型应用 5.1 Ping程序 5.2 Tracert(Traceroute)路径追踪程序 一、什么是ICMP协议&#xff1f; ICMP因特网控制报文协议是一个差错报告机制&#xff0c;…

图文详解PhPStudy安装教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 官方下载 请在PhPStudy官方网站下载安装文件&#xff0c;官方链接如下&#xff1a;https://m.xp.cn/linux.html&#xff1b;图示如下&#xff1a; 请下载PhPStudy安装文件…

Nginx 502 Bad Gateway 错误的原因及解决方法

Nginx 502 Bad Gateway 错误的原因及解决方法 多数是后端问题也就是PHP的问题&#xff0c; 简单的情况可以刷新&#xff08;不是一般的刷新哦&#xff0c;Ctrl F5 强制刷新&#xff09;解决。在php服务当中&#xff0c;有两个参数非常的重要&#xff1a;max_requestst和max_c…