windows Dump 调试

有时候程序的Release 版本发布出去后,在客户的机器上发送异常,大部分的情况下 我们都可以通过我们写的log 发现问题所在,但有时发送崩溃异常(如用到了野指针),我们希望能定位到发送崩溃的代码行。这时我们可以用dump文件。类似于Linux下的core文件。可以叫他“死前遗书”。

1,生成dump 文件。

windows 提供了dbghelp.dll 中的 MiniDumpWriteDump()。函数原型参考MSDN。

程序中先包含"dbghelp.h" "dbghelp.lib"

代码如下:

#include "windows.h"
#include "dbghelp.h"
//
LONG CallBackCrashHandler(EXCEPTION_POINTERS *pException)
{
	// 这里你可以做一个漂亮的界面或者其他
	//
	MessageBox(NULL,L"哎呀妈,崩溃了",L"错误",MB_OK);

	//写dmp文件
	HANDLE hFile = CreateFile( _T("Dump.dmp"), GENERIC_READ | GENERIC_WRITE,
		0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

	//一下请参考MSDN
	MINIDUMP_EXCEPTION_INFORMATION eInfo;
	eInfo.ThreadId = GetCurrentThreadId();
	eInfo.ExceptionPointers = pException;
	eInfo.ClientPointers = FALSE;

	MiniDumpWriteDump(
		GetCurrentProcess(),
		GetCurrentProcessId(),
		hFile,
		MiniDumpNormal,
		pException ? &eInfo : NULL,
		NULL,
		NULL);

	CloseHandle(hFile);

	return EXCEPTION_EXECUTE_HANDLER;
}  

void Crash()
{
	int i = 13;
	int j = 0;
	int m = i / j;
	printf("%d",m);
}  

int _tmain(int argc, _TCHAR* argv[])
{
	// 设置处理Unhandled Exception的回调函数  //程序发送异常调用
	SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CallBackCrashHandler);  

	Crash();

	return 0;
}

2,分析dump 文件。

我用vs2010 分析步骤如下。

1,将客户机器上的Dump.dmp 弄过来。

2,将它和你本机 exe,pdb放在同一个目录。(Release 版本默认是不生成pdb文件的,可以通过“链接器”->“调试”->"生成调试信息"->"是"更改,所以你用svn管理版本的时候 要管理好)(主要exe pdb dmp 要是一致的)

3,用vs 打开Dump.dmp文件。

信息如下:

可以知道异常原因。

4,点击右上角的“使用 使用 仅限本机 进行调试”

即可追查到代码的当前行数。

时间: 2025-01-12 03:44:25

windows Dump 调试的相关文章

深入理解Windows X64调试

随着64位操作系统的普及,都开始大力进军x64,X64下的调试机制也发生了改变,与x86相比,添加了许多自己的新特性,之前学习了Windows x64的调试机制,这里本着“拿来主义”的原则与大家分享. 本文属于译文,英文原文链接:http://www.codemachine.com/article_x64deepdive.html 翻译原文地址:深入Windows X64 调试 在正式开始这篇译文之前,译者先定义下面两个关于栈帧的翻译: frame pointer:栈帧寄存器.栈帧指针,在X86

通过虚拟机搭建windows内核调试环境

今天我们来记录下通过虚拟机搭建windows内核调试环境. 这里是官方文档. 1.在虚拟机设置中为目标计算机创建命名管道 2.在目标计算机中开启调试 3.在windbg中输入目标计算机(虚拟机)的地址信息 4.在windbg菜单中点击[Debug|Break]开始内核调试.

Windows程序调试系列: 使用VC++生成调试信息 转

Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,[email protected], 译自 “Generating debug information with Visual C++”,Oleg Starodumov 出处: http://www.cnblogs.com/itrust/archive/2006/08/17/479603.aspx 引子 当我们使用调试器来调试程序时,我们希望能够单步调试到源代码中,在代码中设置断点,观察变量的值(包括用户自定义的复杂类型的

Windows远程调试Linux上的C++程序:Eclipse+MingW+Samba+GDBserver

转自:http://www.heimizhou.com/windows-remote-debug-linux-c-plus-plus.html 最近有一个需求,就是需要在Windows上远程调试Linux上的C++程序,然后我就从网上搜集各种方法,但是发现很多方法中是先在Windows上编译程序,然后再从Linux上编译程序,最后进行远程调试,这种方法使我的调试不能进入源代码,后来经过尝试发现只需要在Linux上编译程序即可.下面从三个方面:需要安装的软件.安装与配置.配置远程调试,来介绍一下我

Windows Kernel Way 1:Windows内核调试技术

掌握Windows内核调试技术是学习与研究Windows内核的基础,调试Windows内核的方式大致分为两种: (1)通过Windbg工具在Windows系统运行之初连接到Windows内核,连接成功之后便可以调试,此时即可以调试Windows内核启动过程,又可以在Windows启动之后调试某内核组件或应用程序.或使用Windbg的Kernel debugging of the local mechine功能,在Windows系统完全启动之后,调试Windows内核组件或应用程序.这种方式需要配

windows + myeclipse 调试 linux + tomcat 的java web服务 配置方式

一.linux tomcat配置和启动 1.catalina.sh第一行添加 declare -x CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000" 2.启动JPDA(这是tomcat下的启动方式,别的服务器可能会不一样,但道理是一样的) ./catalina.sh jpda start 3.启动web服务 ./start.sh 二.在windows端的myecli

windows内核调试环境心得

最近需要在windows下调试内核程序,原来一直使用windbg+vmware+visualddk进行,但偶然发现vs2012,vs2013可以在IDE中直接进行源代码级别调试,一阵高兴.一阵狂欢,搭建环境,安装vs2013及wdk8.1(我的空间中有较新的wdk8.1),但是一直不是太成功,经过一天的时间折腾,终于可以调试了. (主要参考了http://www.livecodenote.com/2014/04/vs2013-vmware-%e8%b0%83%e8%af%95%e9%a9%b1%

Windows服务调试状态下用Console启动

最近一直在用服务,发现服务也没有那么难调试. Windows服务调试状态下用Console启动:步骤分两步 第一步改Program,启动代码 static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> static void Main(string[] args) { if (Environment.UserInteractive) { //交互模式下执行 var test = new MyChatServi

Core Dump 调试方法

今天调试一个程序, 用到了core dump, 于是写出来, 记于此.什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时,