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

本文介绍了如何在程序崩溃时生成dmp文件,包括修改注册表、在程序中添加代码、使用任务管理器以及WinDbg的多种方法。详细阐述了WinDbg的使用步骤,如设置调试符号、分析函数调用栈,以及调试注意事项,为源码调试提供了实用指导。
摘要由CSDN通过智能技术生成

目录

一、前言

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_DWORD 10 【注 超过最大值时,将最早的 dmp 文件删除】
DumpType

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

REG_DWORD 1
CustomDumpFlags

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

REG_DWORD MiniDumpWithDataSegs | 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 T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值