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命令,就可以重新显示函数和行号信息了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.

运行django测试用例报错django.core.exceptions.AppRegistryNotReady: Apps arent loaded yet. 解决&#xff1a;在测试文件上方加上 django.setup() django.setup()是Django框架中的一个函数。它用于在非Django环境下使用Django的各种功能、模型和设置。 在常规的Django应用…

堆对象数组

C自学精简教程 目录(必读) 之前我们学习了基础类型的堆数组 现在我们来看堆数组的元素是类对象的场景 堆对象数组 堆对象数组的每一个元素都是一个类对象。 使用堆对象数组的语法和使用堆数组的语法是一样的。 #include <iostream> #include <string> using …

ZMTP协议

ZoreMQ Transport Protocol是一个传输层协议&#xff0c;用于ZMQ的连接的信息交互&#xff0c;本文档描述的是3.0协议&#xff0c;主要分析基于NULL Security Mechanism 协议语法 ZMTP由三部分组成&#xff0c;分别是 greeting、handshake、traffic 部分描述构成greeting描述…

移动基站ip的工作原理

原理介绍 Basic Principle 先说一下概念&#xff0c;大家在不使用 WIFI 网络的时候&#xff0c;使用手机通过运营商提供的网络进行上网的时候&#xff0c;目前都是在用户端使用私有IP&#xff0c;然后对外做 NAT 转换&#xff0c;这样的情况就导致大家统一使用一些 IP 段进行访…

Unity中Shader的帧缓存区Clear(color+Z+stencil)

文章目录 前言一、什么是帧缓冲区二、片段运算三、随机扫描显示器&#xff08;可以按照自定义路径绘制帧&#xff09;四、光栅扫描显示器&#xff08;从左到右&#xff0c;从上到下&#xff0c;依次绘制&#xff09;五、缓冲的方式&#xff1a;单缓冲 和 双缓冲1、单缓冲2、双缓…

VBA中如何将if写到一行

在VBA中&#xff0c;可以使用以下两种方式来编写一行if语句&#xff1a; 使用三元运算符&#xff1a; Dim result As String result "Yes" If True Else "No"在这个例子中&#xff0c;如果条件为真&#xff0c;则result变量的值为"Yes"&#…

pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境

pycharm 打开Terminal时报错activate.ps1&#xff0c;因为在此系统上禁止运行脚本&#xff0c;并因此无法进入虚拟环境 如下图所示&#xff1a; 网上说可以set_restrictFalse什么的&#xff0c;虽然也可但可能会降低电脑安全性&#xff0c;可以将下面的终端改为cmd.exe即可

SpringCloudAlibaba Gateway(三)-整合Sentinel功能路由维度、API维度进行流控

Gateway整合Sentinel ​ 前面使用过Sentinel组件对服务提供者、服务消费者进行流控、限流等操作。除此之外&#xff0c;Sentinel还支持对Gateway、Zuul等主流网关进行限流。 ​ 自sentinel1.6.0版开始&#xff0c;Sentinel提供了Gateway的适配模块&#xff0c;能针对路由(rou…

Linux centos7 bash编程——-求质数和

训练项目&#xff1a;使用函数求质数和。 定义一个函数IsPrime()&#xff0c;据此判断一个数是否为质数 由用户输入一个整数&#xff0c;求出比此数大的两个最小质数之和。 一、解决思路: 1.先在键盘上输入一个整数 2.求出比此数大的最小质数 3.再求出比此质数大的另一个…

2.3 Vector 动态数组(迭代器)

C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 Vector<T> 动态数组&#xff08;模板语法&#xff09; 本文目标 1 熟悉迭代器设计模式&#xff1b; 2 实现数组的迭代器&#xff1b; 3 基于迭代器的容器遍历&#xff1b; 迭代器语法介绍 对迭…

全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”

糖尿病是全球高发慢性病中患病人数增长最快的疾病&#xff0c;是导致心血管疾病、失明、肾衰竭以及截肢等重大疾病的主要病因之一。目前中国有近1.4亿成人糖尿病患者&#xff0c;科学的血糖监测和健康管理对于糖尿病患者来说至关重要。 在9月1日全民健康生活方式行动日前夕&am…

如何排查 Flink Checkpoint 失败问题?

分析&回答 这是 Flink 相关工作中最常出现的问题&#xff0c;值得大家搞明白。 1. 先找到超时的subtask序号 图有点问题&#xff0c;因为都是成功没失败的&#xff0c;尴尬了。 借图&#xff1a; 2. 找到对应的机器和任务 方法很多&#xff0c;这里看自己习惯和公司提供…

【网络编程上】

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

探索内网穿透工具:实现局域网SQL Server数据库的公网远程访问方法

文章目录 1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL Server本地连接测试2.3 Cpolar内网穿透的下载和安装2.3 Cpolar内网穿透的注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 数据库的重要性相信大家都有所了解&…

【UE 材质】常用向量运算节点——点积、叉积、归一化

目录 一、点积 二、叉积 三、归一化 一、点积 点积&#xff0c;也称为内积或数量积&#xff0c;是一种用于计算两个向量之间关系的操作。对于两个三维向量 A&#xff08;a1,a2,a3&#xff09;和 B(b1,b2,b3)&#xff0c;它们的点积可以用以下公式表示&#xff1a; ABa1​⋅…

【设计模式】Head First 设计模式——构建器模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点&#xff0c;然后分离它们&#xff0c;从而管理变化。将变化像小兔子一样关到笼子里&#xff0c;让它在笼子里随便跳&#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想 ​ 将一个复杂对象的构建与其表示相分离&…

实验室的服务器和本地pycharm怎么做图传

提前说一个 自认为 比较重要的一点&#xff1a; 容器中安装opencv&#xff0c;可以先试试用 apt install libopencv-dev python3-opencv 我感觉在图传的时候用的不是 opencv-python 而是ubuntu的opencv库 所以用 apt install 安装试一下 参考 远程调试 qt.qpa.xcb: coul…

大数据Flink(七十一):SQL的时间属性

文章目录 SQL的时间属性 一、Flink三种时间属性简介

windows11 利用vmware17 安装rocky9操作系统

下载相关软件和镜像 vmware17 下载 下载页面 Download VMware Workstation Pro ​ rocky8镜像下载 官网链接&#xff1a;Rocky Linux 下载页面 Download Rocky | Rocky Linux 点击Minimal下载 安装rocky9 选择镜像文件&#xff0c;点击下一步 点击下一步 启动虚拟机 选…

程序开发:构建功能强大的应用的艺术

程序开发是在今天的数字化时代中扮演重要角色的一项技术。通过编写代码&#xff0c;开发人员能创造出无数不同的应用&#xff0c;从简单的计算器到复杂的社交平台。电子商务应用、在线教育平台、医疗记录系统等&#xff0c;都重视程序开发的重要性&#xff0c;通过这其中的交互…