精华内容
下载资源
问答
  • VC++生成dump文件
    2013-07-29 16:22:16

     

    #include <time.h>
    #include <Windows.h>
    #include <Dbghelp.h>
    
    #pragma comment(lib, "Dbghelp.lib")
    
    long   __stdcall   crush_callback(_EXCEPTION_POINTERS*   ep) 
    {
    	time_t t;
    	struct tm *p;
    	char fname[256] = {0};
    
    	t = time(NULL) + 8 * 3600;  	//东八区
    	p = gmtime(&t);  
    
    	sprintf(fname, "dump_%d-%d-%d_%d_%d_%d.DMP", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, (p->tm_hour)%24, p->tm_min, p->tm_sec);  
    
    	//TCHAR *pStr = A2T(fname);
    	HANDLE hFile = CreateFileA(fname, 
    		GENERIC_WRITE, 
    		0,
    		NULL,
    		CREATE_ALWAYS,
    		FILE_ATTRIBUTE_NORMAL,
    		NULL);
    	if (hFile == INVALID_HANDLE_VALUE)
    	{
    		return EXCEPTION_CONTINUE_SEARCH;
    	}
    	MINIDUMP_EXCEPTION_INFORMATION    exceptioninfo;
    	exceptioninfo.ExceptionPointers = ep;
    	exceptioninfo.ThreadId          = GetCurrentThreadId();
    	exceptioninfo.ClientPointers    = FALSE;
    
    	if (!MiniDumpWriteDump(GetCurrentProcess(),
    		GetCurrentProcessId(),
    		hFile,
    		MiniDumpWithFullMemory, //这里会将程序运行时的内存写入磁盘,文件较大,如果不需要这些及时的内存信息,用:MiniDumpNormal
    		&exceptioninfo,
    		NULL,
    		NULL))
    	{
    		return EXCEPTION_CONTINUE_SEARCH;
    	}
    	CloseHandle(hFile);
    	return EXCEPTION_EXECUTE_HANDLER;
    }
    
    int main(int argc, char* argv[])   
    {   
    	SetUnhandledExceptionFilter(crush_callback);   
    	_asm   int   3   //只是为了让程序崩溃
    	return   0;   
    }
    

     

    更多相关内容
  • VC++ Dump文件生成

    2020-05-18 16:32:55
    头文件定义(CSWMinidump.h) #ifndef CSW_MINIDUMP_HEAD_FILE #define CSW_MINIDUMP_HEAD_FILE #pragma once #include #...程序异常崩溃,即可在当前目录下生成和应用程序名称一样的dmp文件。如:a.exe -> a.dmp。

    头文件定义(CSWMinidump.h)

    #ifndef CSW_MINIDUMP_HEAD_FILE
    #define CSW_MINIDUMP_HEAD_FILE
    
    #pragma once
    #include <dbgHelp.h>
    #pragma comment(lib, "dbghelp.lib")
    
    namespace sw {
    	namespace Minidump {
    
    		// 启用程序异常崩溃捕获
    		void SetUnhandledExceptionFilter();
    
    	}
    }
    
    #endif

    源码实现(CSWMinidump.cpp)

    #include "pch.h"
    #include "CSWMinidump.h"
    
    namespace sw {
    	namespace Minidump {
    		void AFX_CDECL WriteCrashDumpFile(_EXCEPTION_POINTERS* pExInfo, _MINIDUMP_TYPE WriteFlag)
    		{
    			// WinDbg
    			// analyze -v 自动分析
    			// .ecxr  转到源码
    			if (pExInfo == NULL)
    				RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
    
    			char lpszModuleFilePath[MAX_PATH];
    			GetModuleFileName(NULL, lpszModuleFilePath, MAX_PATH);
    			(_tcsrchr(lpszModuleFilePath, '.'))[0] = 0;
    			strcat_s(lpszModuleFilePath, _T(".dmp"));
    
    			MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
    			dumpInfo.ThreadId = ::GetCurrentThreadId();
    			dumpInfo.ExceptionPointers = pExInfo;
    			dumpInfo.ClientPointers = TRUE;
    			HANDLE hCrashFile = ::CreateFile(lpszModuleFilePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    			if (hCrashFile != INVALID_HANDLE_VALUE)
    			{
    				BOOL bWrite = ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hCrashFile, WriteFlag, &dumpInfo, NULL, NULL);
    				if (bWrite)
    					::FlushFileBuffers(hCrashFile);
    			}
    
    			CloseHandle(hCrashFile);
    			hCrashFile = NULL;
    		}
    
    		LONG WINAPI UnhandledExceptionFilter(_EXCEPTION_POINTERS* lpExceptionInfo)
    		{
    			WriteCrashDumpFile(lpExceptionInfo, MiniDumpWithFullMemory);
    			return EXCEPTION_EXECUTE_HANDLER;
    		}
    
    		void SetUnhandledExceptionFilter()
    		{
    			SetUnhandledExceptionFilter(UnhandledExceptionFilter);
    		}
    	}
    }

    在程序的入口函数部分调用sw::Minidump::SetUnhandledExceptionFilter()。程序异常崩溃,即可在当前目录下生成和应用程序名称一样的dmp文件。如:a.exe -> a.dmp。

    展开全文
  • VC++生成崩溃dump文件(附源码)

    千次阅读 多人点赞 2021-02-05 09:13:25
    Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的, 这种文件必须用专用工具软件打开,比如使用WinDbg打开。现在的vs版本都支持直接...

      VC++开发常用功能一系列文章 (欢迎订阅,持续更新...)

     

    Dump文件是进程内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编写人员调试驱动程序用的,

    这种文件必须用专用工具软件打开,比如使用WinDbg打开。现在的vs版本都支持直接打开dump文件

    调试dump文件最好有pdb文件,不然也不好调试

    直接上源码看:

    头文件:

    #ifndef __MSJEXHND_H__
    #define __MSJEXH
    展开全文
  • 在客户机器上如何得到应该程序的详细出错信息, 这里使用drwtsn32,在应用程序崩溃的时候自动将调用栈的信息以文件形式保存在磁盘。... 生成dump有drwtsn32, NTSD,CDB等多种工具,drwtsn32 于系统自带。
  • VC++ Dump文件生成&分析

    2019-12-24 11:56:16
    } 这样在我们的exe相同工作目录下就会生成一个后缀名为dump的文件,我们用IDE打开这个dump文件(图3): 选择“使用 仅限本机 进行调试”,这个时候会跳转到错误代码行位置(图4): 图4显示的错误描述和图2显示的...

    请看示例(图1):

    很明显,在代码行108行有一个对空指针p的赋值操作,在IDE环境下运行,结果如下(图2):

    提示p是nullptr。一位曾经工作于中科院的学者告诉我,程序运行过程中出现错误提示,90%都是错误指针(空指针、野指针)引起的,鉴于多年工作经验的总结,对于这一点我深信无疑。IDE环境下运行,我们很容易发现和解决类似这种错误,但是如果我们脱离IDE运行,一般都会提示0xC0000005错误提示对话框,这个时候要解决这种问题就有些茫然了,手足无措,不知如何下手了。要解决类似这种问题,我们需要借助应用程序异常调试信息记录文件CrashDump文件,那么我们如何来生成这样的文件呢?请看修改后的代码:

    void ExpTest5() { char *p = NULL; p[0] = 0; }
    void ExpTest4() { ExpTest5(); }
    void ExpTest3() { ExpTest4(); }
    void ExpTest2() { ExpTest3(); }
    void ExpTest1() { ExpTest2(); }
    
    #include <dbgHelp.h>
    #pragma comment(lib, "dbghelp.lib")
    void WINAPI WriteCrashDumpFile(_EXCEPTION_POINTERS * pExInfo, _MINIDUMP_TYPE WriteFlag)
    {
    	//analyze -v 自动分析
    	//.ecxr  转到源码
    	if (pExInfo == NULL)
    		RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
    
    	char lpszModuleFilePath[MAX_PATH];
    	GetModuleFileName(NULL, lpszModuleFilePath, MAX_PATH);
    	(_tcsrchr(lpszModuleFilePath, '.'))[0] = 0;
    	strcat_s(lpszModuleFilePath, ".dump");
    
    	MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
    	dumpInfo.ThreadId = ::GetCurrentThreadId();
    	dumpInfo.ExceptionPointers = pExInfo;
    	dumpInfo.ClientPointers = TRUE;
    	HANDLE hCrashFile = ::CreateFile(lpszModuleFilePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hCrashFile != INVALID_HANDLE_VALUE)
    	{
    		BOOL bWrite = ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hCrashFile, WriteFlag, &dumpInfo, NULL, NULL);
    		if (bWrite)
    			::FlushFileBuffers(hCrashFile);
    	}
    
    	CloseHandle(hCrashFile);
    	hCrashFile = NULL;
    }
    
    LONG WINAPI HandledExpFilter(_EXCEPTION_POINTERS *lpExceptionInfo)
    {
    	WriteCrashDumpFile(lpExceptionInfo, MiniDumpWithFullMemory);
    	return EXCEPTION_EXECUTE_HANDLER;
    }
    
    void TestExceptionWalking()
    {
    	__try
    	{
    		ExpTest1();
    	}
    	__except (HandledExpFilter(GetExceptionInformation()))
    	{
    	}
    }
    
    int _tmain()
    {
    	TestExceptionWalking();
    	system("pause");
    	return 0;
    }
    

    这样在我们的exe相同工作目录下就会生成一个后缀名为dump的文件,我们用IDE打开这个dump文件(图3):

    选择“使用 仅限本机 进行调试”,这个时候会跳转到错误代码行位置(图4):

     图4显示的错误描述和图2显示的错误描述一致,这样我们就可以通过dump文件很方便解决这种类似错误问题。

    注意:要实现在IDE定位到错误代码位置,除了要借助这个dump问题,其中还有一个很重要的文件pdb文件(程序数据库文件)。Debug环境下,编译会自动产生pdb文件,但是Release模式下,就需要我们手动来打开这个选项了,如图5:

    这样一个通过IDE环境下应用程序异常处理方案就介绍完了。说到异常处理机制,肯定要讲解下轻量级调试软件WinDbg,下一遍将简单介绍WinDbg如何来处理类似问题。

    展开全文
  • 生成 Dump 文件后 , 在我们开发本地双击dump文件会打开vs,再在右边点击本地调试,即可运行到奔溃的代码处 注意:当程序为Release时,需要在vs中右键项目属性-链接器-调试-生成调试信息,否则可能不会生成pdb文件,...
  • 本文简单介绍一下如何设置异常回调函数,如何生成保存异常信息的dump文件
  • VC++生成full dump文件

    2019-10-07 12:05:36
    生成mini dump:MiniDumpWriteDump(hProcess, ProcessId, hFile,MiniDumpNormal, ...);生成full dump(会向磁盘写入大量的内存数据,生成时间很长):MiniDumpWriteDump(hProcess, ProcessId, hFile, ...
  •     这几天给自己的程序通过SetUnhandleExceptionFilte加...实测时发现不是所有的崩溃,都能生成dump文件:比如assert(false);语句就没有生成dump文件。上网查了一下发现跟我有相同困惑的人还不少,比如...
  • 参考 关于“程序闪退,没有生成DUMP文件”的一点总结 SetUnhandledExceptionFilter SEH... vc++程序崩溃后不生成dump文件 VS2005中SetUnhandledExceptionFilter函数应用 Qt设置崩溃时产生dmp文件 Q
  • 运行有问题的程序,程序产生dump文件后,双击dump文件 ,文件将在vs中打开,双击vs中右边按钮“Debug with Mixed”,dump文件将自动定位到抛出异常的那句代码。具体看代码,很简单的,一清二楚。 (代码开发环境:vs...
  • 一、什么是PDB文件 1. PDB文件是"程序数据库" Program Data Base的简称,包含的程序的代码...由链接器自动生成 2.文件由两部分构成,私有符号数据(private symbol data )和 公共符号表(public symbol data) ...
  • 上一篇讲到了如果通过IDE环境来分析Dump文件。但是有时候我们可能是通过其它文本编辑软件来写的程序,况且安装VS占用磁盘空间较大,这个时候我们就需要一个轻量级的调试工具帮助我们来分析,首选肯定是WinDbg了,早...
  • VC++使用dump定位release程序崩溃问题

    千次阅读 2018-03-22 21:09:35
    包含生成dump的头文件,头文件见文章末尾全局声明宏DECLARE_DUMPGEN初始化函数中使用宏INIT_DUMPGEN(随便定义一个名字)写一个必然崩溃的按钮响应代码运行程序调用响应函数使程序崩溃,生成dump文件此时定位问题除了...
  • 创建头文件DumpFile.h, 将下列代码放进文件中 #pragma once #include #include #include #include using namespace std; #pragma comment(lib, "Dbghelp.lib") namespace NSDumpFile { void ...
  • dump.h: #pragma once // dump.h #include <windows.h> extern LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo); dump.cpp: // dump.cpp #include <stdio.h> #include <...
  • 一、什么是PDB文件 1. PDB文件是"程序数据库" Program Data Base的简称,包含的程序的代码信息 2.通过这个文件我们可以查看对应断电的位置,堆栈信息等内容 3.使用PDB使得我们无需代码也可以掌握程...
  • vc++ 6.0使用dbghelp.dll生成dmp内存转储文件,包含h、lib和dbghelp.dll文件,仅供参考。
  • [VC++]利用VS2005进行dump文件调试

    千次阅读 2016-01-25 16:38:29
    前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件。使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置。本文将讨论以下内容: ...2、 利用VS2005 分析dump文件 3、 
  • 目的 利用dump和pdb文件来快速定位程序崩溃的地方 步骤 这里写一个简单的崩溃程序。 sample.cpp class Test{ public: void say(){ int a = 0;...1.dump文件生成相关配置 添加两个文件。 CCreateD
  • 如何在发布后程序中捕获程序的崩溃和异常往往是比较麻烦的事情,一般采用日志记录的方法来记录...C++语言中调用window API函数CreateFile()和MiniDumpWriteDump(),可以方便的记录程序崩溃时的Dump信息,并保持dum...
  • windbg生成和分析dump

    千次阅读 2019-08-05 22:18:51
    记录一下使用windbg.exe生成和分析dump文件的过程: 1,在 客户机 的注册表中配置调试工具为windbg.exe,具体方法见上面文章。 2,配置完成后,在 客户机 运行程序,使程序崩溃。如下:下面的例子是除0崩溃的例子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,487
精华内容 594
关键字:

vc++怎么生成dump文件

c++ 订阅