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

前言

  • 本文章主要介绍了如何生成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命令,就可以重新显示函数和行号信息了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV模块介绍

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

Kafka知识点总结

常见名词 生产者和消费者 同一个消费组下的消费者订阅同一个topic时&#xff0c;只能有一个消费者收到消息 要想让订阅同一个topic的消费者都能收到信息&#xff0c;需将它们放到不同的组中 分区机制 启动方法 生成者和消费者监听客户端

stable diffusion实践操作-大模型介绍

本文专门开一节写大模型相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 模型下载网站 国内的是&#xff1a;https://www.liblibai.com 国外的是&#xff1a;https://civitai.com&#xff08;科学上网&#xff09; 一、发展历…

一个面向MCU的小型前后台系统

JxOS简介 JxOS面向MCU的小型前后台系统&#xff0c;提供消息、事件等服务&#xff0c;以及软件定时器&#xff0c;低功耗管理&#xff0c;按键&#xff0c;led等常用功能模块。 gitee仓库地址为&#xff08;复制到浏览器打开&#xff09;&#xff1a; https://gitee.com/jer…

linux安装firefox

1.下载对应包 https://www.mozilla.org/en-US/firefox/all/#product-desktop-release 2. 挂载桌面链接(如果/usr/bin/firefox下有的话,先删除) ln -s /opt/firefox/firefox /usr/bin/firefox 3.执行以下命令&#xff0c;即可启动Firefox客户端&#xff1a; firefox

WSL中为Ubuntu和Debian设置固定IP的终极指南

文章目录 **WSL中为Ubuntu和Debian设置固定IP的终极指南****引言/背景****1. 传统方法****2. 新方法:添加指定IP而不是更改IP****结论**WSL中为Ubuntu和Debian设置固定IP的终极指南 引言/背景 随着WSL(Windows Subsystem for Linux)的普及,越来越多的开发者开始在Windows…

WPF Material Design 初次使用

文章目录 前言相关资源快速开始快速开始说明地址 吐槽一下 前言 MD全称MaterialDesignInXamlToolkit&#xff0c;MaterialDesign和Bootstrap一样&#xff0c;都是一个UI风格库。相当于衣服中的休闲服&#xff0c;汉服&#xff0c;牛仔裤一样&#xff0c;就是风格不一样的Ui框架…

VS + QT 封装带UI界面的DLL

一、创建编译DLL的项目 1.新建Qt Class Liabrary 2.新建项目&#xff0c;选择Qt Widgets Class 3.新建C类&#xff0c;可以在此类里面写算法函数用于调用。 4.下面是添加完Qt窗体类和C类之后的项目截图 5.修改头文件并编译 将uidemo_global.h中的ifdef内容复制到dialog.h上…

leetcode 1365. 有多少小于当前数字的数字

2023.9.2 本题直观的解法就是双层for循环暴力求解&#xff1a; 暴力解&#xff1a; class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> ans;for(int i0; i<nums.size(); i){int temp 0;//比当前元素…

ESP32C3 LuatOS RC522②写入字符串

编写了字符串转16进制表函数 -- 将字符串转换为十六进制表 local function stringToHexTable(str)local hexTable {}local maxLength 16 -- 最大长度为16个元素-- 将字符串转换为十六进制for i 1, #str doif i > maxLength thenbreakendlocal hex string.format("…

Node基础and包管理工具

Node基础 fs 模块 fs 全称为 file system&#xff0c;称之为 文件系统&#xff0c;是 Node.js 中的 内置模块&#xff0c;可以对计算机中的磁盘进行操作。 本章节会介绍如下几个操作&#xff1a; 1. 文件写入 2. 文件读取 3. 文件移动与重命名 4. 文件删除 5. 文件夹操作 6. …

每日一题(链表中倒数第k个节点)

每日一题&#xff08;链表中倒数第k个节点&#xff09; 链表中倒数第k个结点_牛客网 (nowcoder.com) 思路: 如下图所示&#xff1a;此题仍然定义两个指针&#xff0c;fast指针和slow指针&#xff0c;假设链表的长度是5&#xff0c;k是3&#xff0c;那么倒数第3个节点就是值为…

项目总结知识点记录-文件上传下载(三)

&#xff08;1&#xff09;文件上传 代码&#xff1a; RequestMapping(value "doUpload", method RequestMethod.POST)public String doUpload(ModelAttribute BookHelper bookHelper, Model model, HttpSession session) throws IllegalStateException, IOExcepti…

Git使用

本地操作 1. 初始化git仓库 git init 把当前目录变成git可以管理的仓库 git init2.登录-身份认证 区别登录和注册 git config --global user.name “xxx” git config --global user.email “xxxqq.com”/3.下载别人的git git clone https://gitee.com/meini/user-menage…

Gorm简单了解

GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly. 04_GORM查询操作_哔哩哔哩_bilibili 前置&#xff1a; db调用操作语句中间加debug&#xff08;&#xff09;可以显示对应的sql语句 1.Gorm模型定义&#xff08;理解重点&#xff…

色温曲线坐标轴的选取:G/R、G/B还是R/G、B/G ?

海思色温曲线坐标 Mstar色温曲线坐标 高通色温曲线坐标 联咏色温曲线坐标 查看各家白平衡调试界面&#xff0c;比如海思、Mstart、高通等调试资料&#xff0c;白平衡模块都是以R/G B/G作为坐标系的两个坐标轴&#xff0c;也有方案是以G/R G/B作为坐标系的两个坐标轴。 以G/R G…

不同写法的性能差异

“ 达到相同目的,可以有多种写法,每种写法有性能、可读性方面的区别,本文旨在探讨不同写法之间的性能差异 len(str) vs str "" 本部分参考自: [问个 Go 问题&#xff0c;字符串 len 0 和 字符串 "" &#xff0c;有啥区别&#xff1f;](https://segmentf…

002图的基本概念与表示方法

文章目录 一. 图的组成二. 本体图2.1 什么是本体图2.2 怎么设计本体图 三. 图的种类3.1 按连接是否有向分3.2 按本体图分3.3 按连接是否带权重分 四. 节点连接数&#xff08;节点的度&#xff09;4.1 无向图节点的度4.2 有向图节点的度 五. 图的表示方法5.1 邻接矩阵5.2 连接列…

Swift使用PythonKit调用Python

打开Xcode项目。然后选择“File→Add Packages”&#xff0c;然后输入软件包依赖链接&#xff1a; ​https://github.com/pvieito/PythonKit.git https://github.com/kewlbear/Python-iOS.git Python-iOS包允许在iOS应用程序中使用python模块。 用法&#xff1a; import Pyth…

在Mac 上安装flutter 遇到的问题

准备工作 1、升级Macos系统为最新系统 2、安装最新的Xcode 3、电脑上面需要安装brew https://brew.sh/ 4、安装chrome浏览器(开发web用) 下载Flutter、配置Flutter环境变量、配置Flutter镜像 下载Flutter SDK https://docs.flutter.dev/release/archive?tabmacos 根据自己…