程序崩溃时自动记录minidump的c++类===

合集下载

windows系统蓝屏崩溃时生成的内存转储类型

windows系统蓝屏崩溃时生成的内存转储类型

windows系统蓝屏崩溃时生成的内存转储类型一、内存转储类型概述在Windows系统中,当发生蓝屏崩溃时,系统会自动生成一份内存转储文件(Memory Dump File),以便于技术人员分析故障原因。

内存转储文件主要包括以下几种类型:+ 应用程序崩溃转储(COM+ Application Crash Dump)2.内核转储(Kernel Dump)3.完整内存转储(Complete Memory Dump)4.常规转储(Normal Dump)5.转储日志(Dump Log)二、Windows系统蓝屏崩溃原因导致Windows系统蓝屏崩溃的原因有很多,主要包括以下几点:1.硬件问题:如内存条、显卡、硬盘等硬件故障。

2.软件问题:操作系统、驱动程序、应用程序等软件存在缺陷或冲突。

3.系统设置问题:错误的BIOS 设置、错误的电源选项等。

4.病毒感染或恶意软件:病毒、木马等恶意软件破坏系统稳定性和安全性。

5.系统文件损坏:系统关键文件损坏,导致系统运行不稳定。

三、内存转储文件分析方法1.使用Windows自带的内存转储分析工具:Windows自带的内存转储分析工具(Memory Analyzer Tool)可以帮助用户分析内存转储文件,找到潜在的故障原因。

2.使用第三方内存分析工具:如OllyDbg、IDA Pro等,这些工具具有更强大的内存分析功能,帮助用户深入挖掘内存转储文件中的信息。

四、解决蓝屏崩溃的常用方法1.检查硬件:更换内存条、显卡等可能存在故障的硬件。

2.更新驱动程序:确保所有硬件设备的驱动程序都是最新版本。

3.修复系统文件:使用系统自带的修复工具修复损坏的系统文件。

4.清理病毒和恶意软件:使用杀毒软件全盘扫描,清除病毒和恶意软件。

5.优化系统设置:调整BIOS 设置、电源选项等,确保系统运行稳定。

6.分析内存转储文件:使用内存分析工具深入分析内存转储文件,找到故障根源并进行解决。

系统崩溃错误代码解决方法

系统崩溃错误代码解决方法

系统崩溃错误代码解决方法引言:当我们使用计算机时,可能会遇到各种错误代码导致系统崩溃的情况。

这些错误代码往往给用户带来困扰,使得正常的工作和娱乐受到阻碍。

本文将为大家介绍一些常见的系统崩溃错误代码,并提供相应的解决方法,希望能够帮助读者解决系统崩溃问题。

一、蓝屏错误代码解决方法蓝屏错误是Windows操作系统中最常见的系统崩溃问题之一。

当出现蓝屏错误时,计算机会自动重新启动,而且可能会导致文件丢失或数据损坏。

下面是一些常见的蓝屏错误代码及其解决方法:1. 0x0000001A: MEMORY_MANAGEMENT这个错误代码通常表示计算机的内存发生问题。

首先,可以尝试重新安装内存条或更换新的内存条。

此外,还可以运行Windows内存诊断工具,检测内存是否有问题。

如果问题仍然存在,可能需要考虑更换计算机的内存插槽。

2. 0x0000007B: INACCESSIBLE_BOOT_DEVICE这个错误代码指示计算机无法访问启动设备。

可能的原因是硬盘驱动程序损坏或缺失。

一个解决方法是尝试重启计算机,并在启动过程中按F8键进入安全模式。

在安全模式下,可以重新安装硬盘驱动程序或更新操作系统。

3. 0x00000024: NTFS_FILE_SYSTEM这个错误代码表示NTFS文件系统发生了问题。

你可以尝试运行Windows自带的磁盘检查工具,修复文件系统错误。

同时还可以尝试使用第三方磁盘修复工具,如“CHKDSK”,来解决问题。

二、应用程序错误代码解决方法除了系统崩溃外,应用程序错误也是我们常常遇到的问题。

当我们打开一个应用程序时,有时会遇到错误代码导致应用程序崩溃或无法正常工作。

以下是一些常见的应用程序错误代码及其解决方法:1. 0xC0000005: ACCESS_VIOLATION这个错误代码通常表示应用程序试图访问非法的内存地址。

一个解决方法是检查应用程序的版本是否过时,如果是,则需要更新到最新版本。

minidump详细介绍

minidump详细介绍

minidump详细介绍简介在过去⼏年⾥,崩溃转储(crash dump)成为了调试⼯作的⼀个重要部分。

如果软件在客户现场或者测试实验室发⽣故障,最有价值的解决⽅式是能够创建⼀个故障瞬间的应⽤程序状态镜像,然后可以在开发者的机器上通过调试器进⾏分析。

第⼀代的crash dump通常被称为“全⽤户转储(full user dump)”,它包含了进程的虚拟内存的全部内容。

毫⽆疑问,这样的dump对于事后调试⾮常有价值。

但是,这样的dump经常⾮常⼤,使得通过电⼦⽅式发送给开发者⾮常困难,甚⾄没法完成。

另外,没⽤公共接⼝可以通过程序调⽤来创建dump,我们必须依赖于第三⽅⼯具(例如,Dr. Watson 或者Userdump)来创建他们。

随着Windows XP,微软发布了⼀组新的被称为“minidump”的崩溃转存技术。

Minidump很容易定制。

按照最常⽤的配置,⼀个minidump只包括了最必要的信息,⽤于恢复故障进程的所有线程的调⽤堆栈,以及查看故障时刻局部变量的值。

这样的dump⽂件通常很⼩(只有⼏K字节)。

所以,很容易通过电⼦⽅式发送给软件开发⼈员。

⼀旦需要,minidump甚⾄可以包含⽐原来的crash dump更多的信息。

例如,可以包含进程使⽤的内核对象的信息。

另外,DbgHelp.dll提供了通过编程创建minidump的公开API。

⽽且,它是可以重新发布的。

我们可以不再依赖于外部⼯具。

minidump可以定制,给我们带来了⼀个问题-保存多少应⽤程序状态信息才能既保证调试有效,⼜能够尽量保证minidump⽂件尽可能⼩?尽管调试简单的异常访问只需要调⽤堆栈和局部变量的信息,但是解决更复杂的问题需要更多的信息。

例如,我们可能需要查看全局变量的值、检查堆的完整性和分析进程虚拟内存的布局。

同时,可执⾏程序的代码段往往是多余的,开发⽤的机器上可以很容易找到这些执⾏程序。

幸运的是我们可以通过DbgHelp函数组(MiniDumpWriteDump和MiniDumpCallback)来控制这些功能,甚⾄可以更复杂。

windows系统蓝屏崩溃时生成的内存转储类型

windows系统蓝屏崩溃时生成的内存转储类型

windows系统蓝屏崩溃时生成的内存转储类型摘要:1.蓝屏崩溃现象2.内存转储类型3.生成内存转储的原因4.分析内存转储的方法5.预防蓝屏崩溃的建议正文:Windows 系统蓝屏崩溃时生成的内存转储类型在Windows 系统的使用过程中,蓝屏崩溃是一种常见的故障现象。

当系统出现蓝屏崩溃时,往往会生成一种内存转储文件。

这种文件记录了系统在崩溃时的内存状态,对于分析故障原因和解决问题具有重要意义。

本文将介绍Windows 系统蓝屏崩溃时生成的内存转储类型,以及生成内存转储的原因、分析方法和预防建议。

1.蓝屏崩溃现象蓝屏崩溃,又称蓝屏死机,是指Windows 系统在运行过程中突然出现错误,导致屏幕变为蓝色并停止响应。

这种现象通常是由于硬件问题、驱动程序冲突、系统资源不足或软件错误等原因引起的。

蓝屏崩溃会导致正在运行的程序中断,严重时可能需要重装操作系统。

2.内存转储类型Windows 系统蓝屏崩溃时生成的内存转储文件,主要有两种类型:- Mini Dump:这是Windows 系统默认生成的内存转储文件,文件名为“memory.dmp”。

它包含了系统崩溃时内存的重要信息,但文件大小较小,适用于一般故障分析。

- Full Dump:这是一种完整的内存转储文件,文件名为“crash.dmp”。

它包含了系统崩溃时内存的所有信息,文件大小较大,适用于复杂故障分析。

3.生成内存转储的原因内存转储文件的生成与系统崩溃密切相关。

当Windows 系统检测到某种错误,例如内存错误、硬件故障或软件错误等,系统会认为当前状态不稳定,于是自动生成内存转储文件,以帮助用户分析故障原因。

4.分析内存转储的方法要分析内存转储文件,可以使用Windows 自带的故障检测工具,如Windows 故障恢复环境(Windows Recovery Environment,简称Windows RE)和Windows 调试器(Windows Debugger,简称WinDbg)。

minidump蓝屏解决方法

minidump蓝屏解决方法

minidump蓝屏解决方法Minidump蓝屏解决方法。

Minidump蓝屏是指Windows系统发生严重错误时,为了保护系统数据而自动进行的系统崩溃。

当系统发生Minidump蓝屏时,用户会看到蓝色的屏幕,并且系统会自动重启。

这种情况通常会给用户带来困扰,因此需要及时解决。

下面将介绍一些常见的Minidump蓝屏解决方法,希望能帮助到大家。

1. 检查硬件问题。

Minidump蓝屏有可能是由于硬件问题引起的,因此首先需要检查硬件是否正常。

可以检查内存条、硬盘、显卡等硬件设备是否松动或损坏,如果有发现问题,及时更换或修复。

2. 更新驱动程序。

Minidump蓝屏也有可能是由于驱动程序不兼容或过时引起的。

因此,可以尝试更新系统的驱动程序,特别是显卡、声卡等关键驱动程序,以确保其与系统的兼容性。

3. 检查病毒和恶意软件。

病毒和恶意软件也有可能导致Minidump蓝屏问题,因此需要定期对系统进行杀毒和查杀恶意软件。

可以使用正规的杀毒软件进行全盘扫描,清理系统中的病毒和恶意软件。

4. 清理系统垃圾。

系统垃圾和临时文件过多也有可能导致Minidump蓝屏问题,因此需要定期对系统进行清理。

可以使用系统自带的磁盘清理工具或者第三方的系统清理软件进行清理,以释放系统资源。

5. 检查系统更新。

系统更新也有可能解决Minidump蓝屏问题,因为系统更新通常会修复一些系统bug和漏洞。

因此,可以尝试对系统进行更新,以确保系统处于最新状态。

6. 进行系统恢复。

如果以上方法都无法解决Minidump蓝屏问题,可以尝试进行系统恢复。

可以选择将系统恢复到之前的一个稳定状态,以解决系统出现的问题。

总结。

Minidump蓝屏是Windows系统中常见的问题,但是通过以上方法,大部分Minidump蓝屏问题都可以得到解决。

需要注意的是,在进行操作时,一定要谨慎,避免对系统造成不必要的损害。

希望以上方法能够帮助到遇到Minidump蓝屏问题的用户,让系统恢复正常运行。

编写的windows程序,崩溃时产生crashdump文件的办法

编写的windows程序,崩溃时产生crashdump文件的办法

编写的windows程序,崩溃时产⽣crashdump⽂件的办法⼀、引⾔dump⽂件是C++程序发⽣异常时,保存当时程序运⾏状态的⽂件,是调试异常程序重要的⽅法,所以程序崩溃时,除了⽇志⽂件,dump⽂件便成了我们查找错误的最后⼀根救命的稻草。

windows程序产⽣dump⽂件和linux程序产⽣dump⽂件的⽅式不⼀样,linux默认是不让产⽣core dump⽂件,只要在⽤户⾃⼰的~/.bash_profile⽂件中增加ulimit -S -c unlimited > /dev/null 2>&1这样程序崩溃就可以产⽣可调试的core dump⽂件了。

但是windows环境就得写代码才能实现了。

⼆、原理windows程序当遇到异常,没有try-catch或者try-catch也⽆法捕获到的异常时,程序就会⾃动退出,如果这时候没有dump⽂件的话,我们是没有得到任何程序退出的信息。

在windows程序异常退出之前,会预先调⽤⼀个在程序中注册的异常处理回调函数(默认是没有设置),只要我们在这个回调函数中调⽤MiniDumpWriteDump函数就可以产⽣我们想要的dump⽂件。

三、实现1.调⽤SetUnhandledExceptionFilter注册⼀个⾃定义的异常处理回调函数SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);异常处理回调函数的原型LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo);2.CreateFile创建dump⽂件,调⽤MiniDumpWriteDump函数往dump⽂件写异常信息[cpp]1. inline void CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName)2. {3. HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,4. FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);5.6. if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))7. {8. MINIDUMP_EXCEPTION_INFORMATION mdei;9. mdei.ThreadId = GetCurrentThreadId();10. mdei.ExceptionPointers = pep;11. mdei.ClientPointers = NULL;12.13. MINIDUMP_CALLBACK_INFORMATION mci;14. mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;15. mci.CallbackParam = 0;16.17. ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, (pep != 0) ? &mdei : 0, NULL, &mci);18.19. CloseHandle(hFile);20. }21. }CreateMiniDump函数是在异常处理回调函数MyUnhandledExceptionFilter中调⽤的[cpp]1. LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)2. {3. CreateMiniDump(pExceptionInfo, "core.dmp");4.5. return EXCEPTION_EXECUTE_HANDLER;3.将SetUnhandledExceptionFilter失效vs2005中,编译的过程中,编译器会⾃动给你的程序加上⼀句SetUnhandledExceptionFilter(NULL),这就会导致你之前⾃定义的SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);⽆效,就有可能不会产⽣dump⽂件,因此我们必须在⾃定义的SetUnhandledExceptionFilter之后,让之后调⽤的SetUnhandledExceptionFilter ⽆效。

windows 10 minidumpwritedump文件

windows 10 minidumpwritedump文件

windows 10 minidumpwritedump文件
MinidumpWriteDump是Windows 操作系统中用于生成minidump 文件的函数。

Minidump 文件是一个轻量级的转储文件,用于记录程序崩溃时的内存快照和部分线程上下文信息,以便于后续的分析和调试。

在Windows 10 中,minidump 文件通常用于诊断应用程序崩溃或挂起的问题。

当应用程序崩溃时,系统会生成一个minidump 文件,并将其保存在一个特定的目录中(通常是C:\Windows\Minidump)。

要查看或处理minidump 文件,可以使用Windows 事件查看器、DebugDiag 工具集或其他类似的调试和分析工具。

这些工具可以帮助你分析minidump 文件,提取有关崩溃时的线程状态、内存快照和其他有价值的信息。

需要注意的是,生成和分析minidump 文件需要一定的技术背景和经验。

如果你不熟悉这方面的技术,建议寻求专业的技术支持或参考相关的技术文档。

windows系统蓝屏崩溃时生成的内存转储类型

windows系统蓝屏崩溃时生成的内存转储类型

windows系统蓝屏崩溃时生成的内存转储类型文章题目:深度剖析Windows系统蓝屏崩溃时生成的内存转储类型在当今数字化时代,计算机已成为人们不可或缺的工具之一。

而作为常见操作系统之一的Windows系统,由于其稳定性和易用性受到了广大用户的青睐。

然而,在日常使用中难免会遇到系统蓝屏崩溃的情况,这时可能会生成内存转储文件以帮助用户定位问题。

本文将从深度和广度两方面对Windows系统蓝屏崩溃时生成的内存转储类型进行全面评估,并探讨其背后的原理和应用。

1. 蓝屏崩溃与内存转储当Windows系统发生严重错误时,为了保护数据和系统的稳定性,系统会自动进行蓝屏崩溃(BSoD)并生成内存转储文件(Memory Dump)。

内存转储类型有多种,包括完全转储、内核转储、小型转储和自定义转储等。

每种类型都有其特定的用途和适用场景,用户可以根据实际需求进行设置和调整。

2. 完全转储的原理和作用完全转储是指将系统当前的全部内存转储到硬盘上,这包括系统和应用程序的所有数据和运行状态。

当系统发生严重错误导致蓝屏时,完全转储能够为系统管理员提供详细的错误信息和现场快照,有助于分析和解决问题。

然而,由于完全转储文件通常较大,需要较长时间来生成和保存,因此并不适合在所有环境中都启用。

3. 内核转储的特点和适用场景相对于完全转储,内核转储只包含内核和驱动程序的内存信息,可以更快速地生成和保存。

内核转储文件的大小通常介于完全转储和小型转储之间,适用于大部分的蓝屏崩溃情况。

对于普通用户来说,内核转储已能够提供足够的信息用于问题定位和解决,同时也减少了硬盘空间的占用和生成时间。

4. 小型转储的便捷和缺点小型转储是内存转储类型中最快速和占用空间最小的一种。

它只保存系统核心的信息,对于一些轻微的问题或临时性的崩溃情况来说,小型转储已足够提供基本的错误信息和提示,便于用户快速了解问题所在。

然而,由于其信息量有限,对于一些复杂或深层次的问题可能无法提供足够的帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序崩溃时自动记录minidump的c++类
封装了一个C++类,当程序意外崩溃的时候可以生成dump文件,以便确定错误原因。

头文件:
1//crash_dumper_w32.h
2
3 #ifndef _CRASH_DUMPER_H_
4
5#define _CRASH_DUMPER_H_
6
7
8 #include <windows.h>
9
10class CrashDumper
11
12 {
13
14public:
15
16CrashDumper();
17
18~CrashDumper();
19
20static bool _PlaceHolder();
21
22private:
23
24LPTOP_LEVEL_EXCEPTION_FILTER m_OriginalFilter;
25
26static LONG WINAPI ExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo); 27
28 };
29
30
31namespace
32
33 {
34const bool bPlaceHolder = CrashDumper::_PlaceHolder();
35
36 }
37
38#endif
实现文件:
1 crash_dumper_w32.cpp
2
3
4
5 #include <windows.h>
6
7 #include <tchar.h>
8
9 #include <dbghelp.h>
10
11 #include <string>
12
13
14
15 #include "crash_dumper_w32.h"
16
17
18
19 #ifdef UNICODE
20
21 # define tstring wstring
22
23#else
24
25 # define tstring string
26
27#endif
28
29
30
31#pragma comment(lib, "dbghelp.lib")
32
33
34
35 CrashDumper dumper;
36
37
38
39 CrashDumper::CrashDumper()
40
41 {
42
43m_OriginalFilter = SetUnhandledExceptionFilter(ExceptionFilter);
44
45 }
46
47
48
49 CrashDumper::~CrashDumper()
50
51 {
52
53SetUnhandledExceptionFilter(m_OriginalFilter);
54
55 }
56
57
58
59 LONG WINAPI CrashDumper::ExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
60
61 {
62
63bool bDumpOK = false;
64
65DWORD dwProcess = GetCurrentProcessId();
66
67HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcess);
68
69if (hProcess != INV ALID_HANDLE_V ALUE)
70
71{
72
73TCHAR szPath[MAX_PA TH];
74
75if (GetModuleFileName(NULL, szPath, sizeof(szPath)))
76
77{
78
79std::tstring strDumpFileName = szPath;
80
81strDumpFileName += TEXT(".dmp");
82
83HANDLE hFile = CreateFile(strDumpFileName.c_str(), FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, NULL, NULL);
84
85if (hFile != INV ALID_HANDLE_V ALUE)
86
87{
88
89MINIDUMP_EXCEPTION_INFORMATION exception_information;
90
91exception_information.ThreadId = GetCurrentThreadId();
92
93exception_information.ExceptionPointers = ExceptionInfo;
94
95exception_information.ClientPointers = TRUE;
96
97if(MiniDumpWriteDump(hProcess, dwProcess, hFile, MiniDumpNormal, &exception_information, NULL, NULL))
98
99{
100
101bDumpOK = true;
102
103}
104
105
106
107CloseHandle(hFile);
108
109}
110
111}
112
113
114
115CloseHandle(hProcess);
116
117}
118
119
120
121if (bDumpOK)
122
123MessageBox(NULL, TEXT("本程序遇到未处理的异常,MiniDump文件已经生成在程序的运行目录。

"), TEXT("提示"), MB_OK);
124
125else
126
127MessageBox(NULL, TEXT("本程序遇到未处理的异常,生成MiniDump文件失败。

"), TEXT("提示"), MB_OK);
128
129
130
131return EXCEPTION_EXECUTE_HANDLER;
132
133 }
134
135
136bool CrashDumper::_PlaceHolder() {return true;}
代码很简单,唯一需要提一下的是下面的一句代码,这个技巧是为了解决当crash_dumper_w32.cpp文件被编译成单独的静态库在程序中使用不起作用的问题。

namespace
{
const bool bPlaceHolder = CrashDumper::_PlaceHolder();
}
之所以在静态库中.cpp中的代码不起作用,是因为没有代码去调用crash_dumper_w32.cpp的代码,链接的时候就被编译器给丢掉了。

上面的语句在匿名空间中定义了一个变量,这样,每一个包含它的.cpp文件就“被迫”创建了一个不可访问的bPlaceHolder变量,而该变量又必须使用CrashDumper::_PlaceHolder()函数来初始化。

crash_dumper_w32.cpp文件的代码就被强制链接进来了。

此外,如果是服务类型的程序,还可以在异常处理函数中增加自动启动新实例的功能,以保证服务不间断。

相关文档
最新文档