当程序崩溃 产生 崩溃转储文件 (dump) + Windbg调试方法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

目录

一、前言

1. 什么是 core dump

2. 无法生成 dmp 文件

二、创建 dmp 方法

1. 修改注册表 当程序崩溃时 产生崩溃转储文件(dmp)

a) OpenDump.bat - 自动生成dmp文件

b) 注册表 参数说明:

c) CloseDump.bat - 关闭此功能

 2. 在程序中加入代码

3. 任务管理器 - 适用崩溃未立即退出

4. WinDbg抓取 - 程序闪退 无法生成 dmp

a). 崩溃程序

b). 打开 WinDbg

c). 执行程序

d). 查找问题函数

e).设置调试Symbol

5. WinDbg抓取 - 适用崩溃未立即退出

6. WinDbg - 加载 dmp 文件进行调试

步骤:

基本调试命令

三、调试

1. 注意事项

四、Windbg 源码调试

1. 源码调试

2.Windbg工作空间

3.Windbg的命令分类


一、前言

1. 什么是 core dump

  Coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。

   该文件也是二进制文件,可以使用gdb、elfdump、objdump或者windows下的windebug、solaris下的mdb进行打开分析里面的具体内容。

   注:core是在半导体作为内存材料前的线圈,当时用线圈当做内存材料,线圈叫做core。用线圈做的内存叫做core memory。
 

2. 无法生成 dmp 文件

虽然我们知道进程在coredump的时候会产生core文件,但是有时候却发现进程虽然core了,但是我们却找不到core文件

可以将 dmp 文件的大小调高

 

二、创建 dmp 方法

1. 修改注册表 当程序崩溃时 产生崩溃转储文件(dmp)

以管理员身份 运行 :OpenDump.bat 其本质是写注册表。
运行后: 任何程序崩溃都会在C:\CrashDump 产生dmp文件(比较大,约50到200M)。
至少在Win7、Win10的电脑,Win10的平板上运行正确。

a) OpenDump.bat - 自动生成dmp文件

@echo off
echo 正在启用Dump...
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\CrashDump" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
echo Dump已经启用
pause
@echo on

b) 注册表 参数说明:

Value描述Type默认值
DumpFolder文件保存路径

REG_EXPAND_SZ

%LOCALAPPDATA%CrashDumps
DumpCount

dump文件的最大数目

REG_DWORD10 【注 超过最大值时,将最早的 dmp 文件删除】
DumpType

指定生成的dump类型:
0:Custom dump
1:Mini dump
2:Full dump

REG_DWORD1
CustomDumpFlags

仅在DumpType为0时使用
为MINIDUMP_TYPE的组合

REG_DWORDMiniDumpWithDataSegs | MiniDumpWithUnloadedModules |
MiniDumpWithProcessThreadData

c) CloseDump.bat - 关闭此功能

@echo off
echo 正在关闭Dump...
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /f
echo Dump已经关闭
pause
@echo on

 2. 在程序中加入代码

程序中加入存储Dump的代码

通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件

#include<windows.h>
#include<DbgHelp.h>

#include "createdump.h"

// 处理Unhandled Exception的回调函数
LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
	CreateMiniDump(pExceptionInfo, L"Exception.dmp");
	exit(pExceptionInfo->ExceptionRecord->ExceptionCode);
	return EXCEPTION_EXECUTE_HANDLER; // 程序停止运行
}
 
void fun(int *p)
{
	p[0]=0;
}
int main(int argc, char * argv[])
{
	//注册异常处理函数
	SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter); 
	fun(NULL);
	return 0;
 
}

 "createdump.h"

#pragma once

#include <windows.h>
#include <imagehlp.h>
#include <stdlib.h>
#pragma comment(lib, "dbghelp.lib")

inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)
{
	if (pModuleName == 0)
	{
		return FALSE;
	}
	WCHAR szFileName[_MAX_FNAME] = L"";
	_wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);
	if (wcsicmp(szFileName, L"ntdll") == 0)
	{
		return TRUE;
	}
	return FALSE;
}

inline BOOL CALLBACK MiniDumpCallback(PVOID pParam, const PMINIDUMP_CALLBACK_INPUT pInput, PMINIDUMP_CALLBACK_OUTPUT pOutput)
{
	if (pInput == 0 || pOutput == 0)
		return FALSE;

	switch (pInput->CallbackType)
	{
	case ModuleCallback:

		if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg)
			if (!IsDataSectionNeeded(pInput->Module.FullPath))
				pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

	case IncludeModuleCallback:

	case IncludeThreadCallback:

	case ThreadCallback:

	case ThreadExCallback:

		return TRUE;

	default:;

	}

	return FALSE;
}

inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
{
	HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
	{
		MINIDUMP_EXCEPTION_INFORMATION mdei;
		mdei.ThreadId = GetCurrentThreadId();
		mdei.ExceptionPointers = pep;
		mdei.ClientPointers = FALSE;
		MINIDUMP_CALLBACK_INFORMATION mci;
		mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
		mci.CallbackParam = 0;

		MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory | MiniDumpWithDataSegs | MiniDumpWithHandleData | 0x00000800 /*MiniDumpWithFullMemoryInfo*/ | 0x00001000 /*MiniDumpWithThreadInfo*/ | MiniDumpWithUnloadedModules);

		MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);
		CloseHandle(hFile);
	}
}

3. 任务管理器 - 适用崩溃未立即退出

在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件

此时会在默认的目录下创建出一个dump文件。

可以看出,此种方法只适用于程序崩溃但没有立即自行退出的情况。倘若程序故障后自行退出,则此方法就难以应用。

4. WinDbg抓取 - 程序闪退 无法生成 dmp

a). 崩溃程序

在使用Windbg调试程序之前,先给大家展示下我的测试程序:

int main()
{
   char* pStr = (char*)0xa;
   printf("%s\n", pStr);
   return 0;
}

b). 打开 WinDbg

选择 "File" -- "Open Executable" -- "选择可执行 exe"

Windbg命令窗口打印信息如下:

Microsoft (R) Windows Debugger Version 6.3.9600.16384 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: C:\Users\Administrator\Desktop\testforme.exe
Symbol search path is: *** Invalid ***
****************************************************************************
 1. Symbol loading may be unreliable without a symbol search path.           *
 2. Use .symfix to have the debugger choose a symbol path.                   *
 3. After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************
Executable search path is:
ModLoad: 00000000`00400000 00000000`00410000   testforme.exe
ModLoad: 00000000`77390000 00000000`77539000   ntdll.dll
ModLoad: 00000000`77570000 00000000`776f0000   ntdll32.dll
ModLoad: 00000000`74420000 00000000`7445f000   C:\Windows\SYSTEM32\wow64.dll
ModLoad: 00000000`743c0000 00000000`7441c000   C:\Windows\SYSTEM32\wow64win.dll
ModLoad: 00000000`743b0000 00000000`743b8000   C:\Windows\SYSTEM32\wow64cpu.dll
(9f8.4d4): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll -
ntdll!CsrSetPriorityClass+0x40:
00000000`7743cb70 cc              int     3

【备注】

  • 请确保所调试的软件,全部都生成 pdb 文件 ( Release 版)
  • 可以看到已经加载的模块,以及这些模块所在的内存区域。比如可以看出 exe 的模块位置在内存0x400000~ 0x410000
  • 调试器中断,这时还没有真正去执行testforme的代码,并且可以通过Windbg命令去设置断点,查看已加载模块的信息等操作

c). 执行程序

在命令行下使用 g 命令, 可以看到程序中断了在Access Violation,也就是内存访问错误。

0:000:x86> g
(7b8.238): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** ERROR: Module load completed but symbols could not be loaded for testforme.exe
testforme+0x1e88:
00401e88 803800          cmp     byte ptr [eax],0           ds:002b:0000000a=??

d). 查找问题函数

然后我们用 kv 指令查看当前异常处的函数调用栈

0:000:x86> kv
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
0018fcf0 00812d70 00000000 00810000 0018fd48 testforme+0x1e88
00000000 00000000 00000000 00000000 00000000 0x812d70

这个完全看不出来哪里异常了啊,那是因为并没有配置应用程序相应的符号文件,也就是之前所说的PDB文件

e).设置调试Symbol

0:000:x86> .sympath C:\mysymbols;SRV*C:\symbols*http://msdl.microsoft.com/download/symbols

Symbol search path is: C:\mysymbols;SRV*C:\symbols*http://msdl.microsoft.com/download/symbols
Expanded Symbol search path is: c:\mysymbols;srv*c:\symbols*http://msdl.microsoft.com/download/symbols

************* Symbol Path validation summary **************
Response                         Time (ms)     Location
OK                                             C:\mysymbols
Deferred                                       SRV*C:\symbols*http://msdl.microsoft.com/download/symbols

先通过.sympath设置符号文件的目录。可以将testforme.pdb存放到设置好的符号目录C:\mysymbols。SRV*C:\symbols*http://msdl.microsoft.com/download/symbols这标明将从http://msdl.microsoft.com/download/symbols下载微软的PE文件对应的符号文件,并且缓存到C:\symbols目录下。 你也可以通过File->Symbol Search Path查看符号目录设置(如下图),当然也可以在这里直接对符号目录进行设置。

接着调用.reload命令重新加载模块的符号信息,然后调用kv就可以查看函数异常的函数调用栈了!

0:000:x86> .reload
Reloading current modules
........
0:000:x86> kv
ChildEBP RetAddr  Args to Child              
0018fee8 00401085 0040c028 0040b344 00000000 testforme!_output_l+0x7f4 (FPO: [Non-Fpo]) (CONV: cdecl) [f:\sp\vctools\crt_bld\self_x86\crt\src\output.c @ 1648]
0018ff2c 0040100c 0040b344 0000000a 004012aa testforme!printf+0x73 (FPO: [Non-Fpo]) (CONV: cdecl) [f:\sp\vctools\crt_bld\self_x86\crt\src\printf.c @ 63]
0018ff88 7700336a 7efde000 0018ffd4 77909f72 testforme!main+0xc (FPO: [0,0,0]) (CONV: cdecl) [d:\vsproject\testforme\testforme\test.cpp @ 11]
0018ff94 77909f72 7efde000 3cf2f376 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo])
0018ffd4 77909f45 00401301 7efde000 ffffffff ntdll32!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo])
0018ffec 00000000 00401301 7efde000 00000000 ntdll32!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])

通过函数调用栈,可以清楚的看出异常发生在main函数中,在test.cpp第11行处调用了printf。熟悉Windows函数栈的同学应该比较清楚,ChildBEP在32位程序中表示当前调用栈的栈底指针,并且指向的内存处保存的是上一个栈贞的栈底位置。 Args to Child表示当前函数的参数,比如这里printf的参数分别为0040b344和0000000a: 0000000a表示测试程序中变量pStr的值,而0040b344则表示格式化字符串,我们可以使用 da 命令来查看一下:

0:000:x86> da 0040b344
0040b344  "%s."

当然有时候你需要切换到特定的栈贞(frame),去查看当前 frame 下的上下文信息,比如局部变量。例如我们现在想去看看main 函数下的变量的值,先用 kn 命令查看栈贞的编号,然后用 .frame 切换到 main 函数那一帧接着用 dv -V 查看所有的局部变量:

0:000:x86> kn
 # ChildEBP RetAddr  
00 0018fee8 00401085 testforme!_output_l+0x7f4 [f:\sp\vctools\crt_bld\self_x86\crt\src\output.c @ 1648]
01 0018ff2c 0040100c testforme!printf+0x73 [f:\sp\vctools\crt_bld\self_x86\crt\src\printf.c @ 63]
02 0018ff88 7700336a testforme!main+0xc [d:\vsproject\testforme\testforme\test.cpp @ 11]
03 0018ff94 77909f72 kernel32!BaseThreadInitThunk+0xe
04 0018ffd4 77909f45 ntdll32!__RtlUserThreadStart+0x70
05 0018ffec 00000000 ntdll32!_RtlUserThreadStart+0x1b
0:000:x86> .frame 2
02 0018ff88 7700336a testforme!main+0xc [d:\vsproject\testforme\testforme\test.cpp @ 11]
0:000:x86> dv /V

奇怪了为啥 dv /V 并没有打印出临时变量  pStr 呢? 会不会是因为被优化了? 于是就用 uf 命令反汇编了一下 main 函数 (如下), 可以看到 printf 的参数压栈直接用的是常量 0A

0:000:x86> uf main
testforme!main [d:\vsproject\testforme\testforme\test.cpp @ 9]:
    9 00401000 6a0a            push    0Ah
   11 00401002 6844b34000      push    offset testforme!`string' (0040b344)
   11 00401007 e806000000      call    testforme!printf (00401012)
   11 0040100c 83c408          add     esp,8
   12 0040100f 33c0            xor     eax,eax
   13 00401011 c3              ret

所以在调试优化后的程序要注意这些可能的变化,当然如果你想让Release的程序不进行优化,可以在Visual Studio中关闭这个选项,如下图:

这里我就不再展示关闭优化后,用windbg调试打印局部变量了,大家可以自己试一试。

5. WinDbg抓取 - 适用崩溃未立即退出

程序运行崩溃后,先不关闭程序,将WinDbg附加到改进程上

执行命令:.dump –ma Test.dmp  ,则会产生一个Test.dmp的转储文件。

6. WinDbg - 加载 dmp 文件进行调试

步骤:

1).软件 dll 库含有调试信息 pdb

2).将 dmp 文件放置在软件目录exe下

3).打开 WinDbg,选择 File->Open Crash Dump...选择 dmp 文件

4).在 WinDbg 命令输入框中输入:  !analyze -v;r;kv;lmtn;.logclose;      然后回车

【注】

可先在命令框输入: kv  回车,查看堆栈信息

!analyze -v lmtn ;命令非常耗时

基本调试命令

r       可以显示系统崩溃时的寄存器,和最后的命令状态。

dd    显示当前内存地址,dd 参数:显示参数处的内存。

u      可以显示反汇编的指令

!analyze -v     显示分析的详细信息。

kb     显示 call stack 内容

kv     显示 call stack 内容 (比  kb 多一列 “Child-SP”)

kv.bugcheck    可以显示出错的代码

三、调试

1. 注意事项

      a) 最好把 exe, pdb, dmp 放到同一文件夹下

      b) 必须保证pdb与出问题的exe是同一时间生成的

      c) 当把 pdb 文件与 dmp 文件放入同一目录下时,就不需设置其路径,否则需要设置 符号表 文件路径 和 源代码路径

工具->选项->调试->符号:

设置源代码路径: 属性->调试源代码

四、Windbg 源码调试

1. 源码调试

习惯于VS调试的同学,可能会觉得Windbg命令调试难记难用(事实上,当你熟悉了之后可能会改变看法)。虽然没有VS的强大的源码调试功能,其实Windbg也提供源码调试的功能。可以通过.srcpath命令或者通过菜单File->Source Search Path去设置源码的目录。

现在我将测试源码拷贝到C:\source目录,然后在用Windbg 程序后,设置断点到测试程序的main函数入口处,然后继续执行程序:

0:000> bp testforme!main
0:000> g

这时候你会看到源码文件自动弹出来了,并且中断在main入口处:

Windbg 还提供直接打开Source文件的功能File->Open Source File...,在调试前打开源码文件,可以直接在里面设置断点,调试的快捷键和Visual Studio一样!

2.Windbg工作空间

Windbg的工作空间主要表示调试会话的状态、调试器的设置以及窗口布局的设置等。工作空间的使用主要分为以下几点:

  •     未加载任何调试文件的时候,选择File -> Save Workspace保存默认工作空间,则当每次打开Windbg的时候,将采用这个默认的工作空间
  •     当调试器已经加载了调试文件的时候,选择File -> Save Workspace将当前工作空间保存为默认工作空间 (这个默认空间仅针对这个调试文件), 则当下次还是调试这个文件的时候,则采用之前保存的默认工作空间。
  •     可以选择File -> Save Workspace As...保存为命名的工作空间,在以后调试应用程序的时候可以选择File -> Open Workspace去打开指定的工作空间
  •     以上的工作空间都保存在注册表项HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces里面,你也可以通过File -> Save Worksapce to File...将工作空间保存到文件

还有删除工作空间等操作,大家可以自己去熟悉一下。

3.Windbg的命令分类

Windbg主要分为3大类的调试命令:

  •     标准命令 (Standard Command): 这类命令对于所有的调试目标都试用,比如常见的k命令;
  •     元命令 (Meta-Command): 这类目标主要针对特定的目标所做的扩展命令,比如常见的.sympath命令。因为这类命令前面都有一个.,所以也叫作Dot-Command;
  •     扩展命令 (Extension Command):标准命令和元命令都是Windbg内建的命令,而扩展命令是实现在动态加载的DLL中。这类命令前面都有一个!, 比如常用analyze -v.

顺便再这里提一个很实用的命令.hh,用来在Windbg中打开帮助文档,比如使用.hh k则帮助文档会打开到索引k命令处。
 

详情参照 https://blog.csdn.net/bcbobo21cn/article/details/60468969

 

 

Windows下使用Windbg处理Qt崩溃转储dmp 目录 1.简介 2.生成dump文件 2.1修改注册表(方式1) 2.2修改注册表(方式2) 2.3修改代码,设置回调函数(方式3) 3.修改pro文件 4.Windbg调试dmp 4.1设置 4.2解析dmp文件 1.简介 崩溃转储时在软件崩溃时,把堆栈信息保存到日志,便于定位崩溃位置(未深入研究,这是我自己的理解) 2.生成dump文件 2.1修改注册表(方式1) 注册表定位到以下节点:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Window 阅读详情

相关推荐

转储文件是什么?愣着干嘛!不懂当然得学了

之前做数据库相关题目的时候,被一道有关转储文件的题给难住了,这转储文件到底是什么啊!不行,我得把它弄懂!愣着干嘛!这种求知若渴的精神不值得点赞吗? 文章目录一、概念二、转储文件的作用三、抓取转储文件 一、概念 转储文件,又叫dump文件。简单来说,转储文件是进程某一时刻的快照。 微软官方对转储文件的定义是这样的:转储文件是应用程序在进行转储那一时刻的快照。它显示了正在执行的进程以及已加载的模块。如...

Xyuan丶的博客 2万+

Windbg使用详解(全面 实用)

《软件调试》第三十章,详细讲解Windbg的使用。windows程序员必读。

使用WinDbg分析Windows dump文件方法

analyze -v"链接,或者在下面的命令窗口中输入“!analyze -v”命令,工具就对dump文件进行分析,然后输出导致系统崩溃的起因等相关信息。在安装Windows SDK的过程中,可以选择只安装WinDbg(Debugging Tools for Windows)这个组件。工具来分析windows系统产生dump文件,此工具属于Windows SDK的一个组件,在微软官方网站可以下载(1)打开WinDbg工具,通过菜单“File”->“Open Crash Dump”打开dmp文件

sway913的博客 6293

Windows下生成dump文件的三种方式

windows平台下dump文件的生成方式

qq_58397358的博客 2万+

windows 应用程序崩溃时的内存转储dump文件的分析

1、在现场设置程序崩溃时的自动内存转储,得到dump文件        在windows 注册表如下项:      //HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/AeDebug      中提供了调试器的相关设置。       Debugger  设置具体的调试器和启动参数       Auto

SP_daiyq的专栏 2万+

Windows上使用dump文件调试

dump文件记录当前程序运行某一时刻的信息,包括内存,线程,线程栈,变量等等,相当于调试程序时运行到某个断点上,把程序运行的信息记录下来。可以通过Windbg打开dump,查看程序运行的变量等,来调试程序

Wlk1229 4625

Windows下的Dump文件

一、    生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出,此种方法只使用与程序崩溃但没有立即自行退出的情况。倘若程序故障或自行退出,则此方法就难以应用。不过,我们可以在注册表中添加如下信息已确保系统在程序崩溃后自行保存一个dump文件

xiaoluo91的专栏 1万+

如何在 Windows 中捕获和调试 .NET 应用程序崩溃转储

将符号搜索路径设置为 Microsoft 的公共符号服务器(用于 Microsoft 拥有的二进制文件)和我们的应用程序编译输出文件夹(我们的 .pdb 符号文件所在的位置)。记录到事件日志中的堆栈跟踪可能并不总是足够的,我们希望更深入地探索以找出崩溃时进程中发生的事情,或者使用专门的工具对其进行分析。在这种情况下,您应该会在 Windows 事件日志的应用程序日志中看到一些与崩溃相关的 WER 事件,但在 WER 存储崩溃数据的文件夹中看不到内存转储文件 (*.dmp)。在我们的例子中,只有两个线程。

u011234288的博客 704

使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查程序崩溃问题

程序中安装的异常捕获模块捕获不到异常、没有生成dump文件时,可以尝试到系统应用程序日志中去找系统自动生成的dump文件,以排查当前的软件崩溃问题。本文以一个项目问题实例去详细讲述如何从系统应用程序日志中找到的系统自动生成的dump文件,然后使用Windbg打开dump文件进行静态分析去排查异常崩溃问题。

dvlinker的技术专栏 5万+

Windows下dump文件生成与分析

一、生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件。 此时会在默认的目录下创建出一个dump文件。 可以看出,此种方法只适用于程序崩溃但没有立即自行退出的情况。倘若程序故障后自行退出,则此方法就难以应用。不过,我们可以在注册表中添加如下信息已确保系统在程序

icandoit2010的专栏 10万+

WinDbg调试 崩溃程序

目的:学习和记录WinDbg的一些使用。 声明:文章里面的很多东西都是取自网络上面,有出去的我会尽量注明出处。对于那些找不到地址的如果作者需要我可以后面添加。   1.安装和下载         WinDbg的下载地址,现在直接搜索官网的时候感觉好难找到直接下载地址,都是一些什么下载sdk什么的,其实我就想安装一个WinDbg而已,这里给出两个下载链接: 下载路径 32位 http:/

nanjun520的专栏 4802

Windbg分析dump崩溃

首先抓dump.在任务管理器->进程里面进行抓dump. 然后需要的原材料有dump、源码、pdb 打开windbg把源码路径和pdb路径添加进去。 需要打开的窗口包括线程窗口(Processes and Threads)、Calls窗口、Command窗口。 把dump拖进去,如果Dump文件是64位的,在分析时,需要根据被转储文件的位数来判断是否转为32位的,转换的命令如下: ....

Scarlett_OHara的博客 3109

mcp-windbg高级技巧:如何用AI解析复杂崩溃转储文件

mcp-windbg是一款基于Model Context Protocol的WinDBG辅助工具,它能帮助开发者快速分析崩溃转储文件,提升调试效率。本文将分享使用mcp-windbg进行AI驱动的崩溃转储解析高级技巧,让你轻松应对复杂的调试场景。 ## 安装mcp-windbg的简单步骤 要开始使用mcp-windbg,首先需要安装它。通过pip命令可以轻松完成安装: ``` pip ins

gitblog_00432的博客 742

Windbg调试dump文件

用Windows自带的windbg,在调试工具,使用dump文件查找崩溃的位置

bigger_belief的博客 8084

如何让C++程序自动生成dump文件?如何使用Windbg分析dump文件

本文讲述如何让C++程序自动生成dump文件,以及如何使用Windbg分析dump文件

dvlinker的技术专栏 9602

通过WinDbg生成dump文件

在Windows开发环境下,通常使用Visual studio完成项目的开发以及调试,很少会用到WinDbgWinDbg提供了强大的调试功能,在一些情况下,Visual Studio附带的调试工具无法完成调试工作,只有通过WinDbg来完成,例如,对dump文件的分析。 1. dump 文件简介 dump 文件是指内存转储文件,是系统在程序崩溃时将当前相关内存状态存储到硬盘上的文件,用于对系

Fire_Lord的专栏 2209

Windbg调试一)minidump崩溃捕捉

Windbg调试四)dump崩溃捕捉一,系统的异常处理顺序二,SetUnhandleExceptionFilter函数三,Minidump四,代码演示 平常我们编写c++代码时,发生崩溃,编译器都可以帮我们捕捉到并且定位到具体的代码,这是因为编译器接收到了操作系统发送过来的程序异常通知并进行了处理。但是在使用我们软件的用户环境上,没有编译器帮我们处理这个异常,操作系统会使用它的异常处理机制:弹出...

bajianxiaofendui的博客 1万+

如何在程序中生成崩溃转储dump文件以及如何分析dump

关于更详细的内容,如果有兴趣,可以访问下面的视频 https://edu.csdn.net/course/detail/28915 程序崩溃的时候如何生成dump文件 话不多说,直接上代码,下面的程序崩溃,而且会在崩溃的时候在运行目录生成dump文件。 #include "stdafx.h" #include <Windows.h> #include <Dbghelp.h> #include <stdio.h> LONG WINAPI handle_e.

zhanghaiyang9999的专栏 1631
上一篇: 音视频-位深度、采样率以及码率(1)
下一篇: Qt5.12.0 / Qt5.12.5 请求 https 资源提示 TLS initialization failed
LearnLHC
博客等级 码龄9年 180粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值