windows server dump文件

1. mini dump:

***** 需要包含 dbghelp.dll 库

****mini_dump.h文件:

// reference:https://msdn.microsoft.com/zh-cn/library/windows/desktop/ee416349(v=vs.85).aspx

#ifndef mini_dump_h__
#define mini_dump_h__

namespace minidump
{
void MiniDumpBegin(const char* app_name, const char* app_version);
}

#endif // mini_dump_h__

mini_dump.cpp文件:

#include "mini_dump.h"

#include <windows.h>
#include <shellapi.h>

#include <string>

// Is dbghelp.h dbghelp.lib dbghelp.dll windows build-in?
#include <dbghelp.h>
#pragma comment (lib,"dbghelp.lib")

// Visual Studio 2005 compatible
#define snprintf(buf,len, format,...) _snprintf_s(buf, len,len, format, __VA_ARGS__)

namespace minidump
{
// needn‘t delete
std::string* app_name = 0;

std::string* app_version = 0;

// "c:\folder1\xxx.exe" to "c:\folder1\"
std::string GetDirectory(const std::string& execution)
{
std::string path("");
size_t pos = execution.find_last_of("\\");
if (pos != std::string::npos)
path = execution.substr(0, pos + 1);
return path;
}

// Generage dump file to avoid file name collisions
std::string GetDumpFileMark()
{
SYSTEMTIME system_local_time;
GetLocalTime(&system_local_time);

char file_name[MAX_PATH];

snprintf(file_name, MAX_PATH, "%s%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
app_name->c_str(), app_version->c_str(),
system_local_time.wYear, system_local_time.wMonth, system_local_time.wDay,
system_local_time.wHour, system_local_time.wMinute, system_local_time.wSecond,
GetCurrentProcessId(), GetCurrentThreadId());

return file_name;
}

// Generate dump file whole name in GetModuleFileName()‘s directory
// Like: F:\reference\project\TestMiniDump\VsProject\build\Debug\dump\20161015-110026-8552-9344.dmp
std::string GetDumpFileName()
{
char file_path[MAX_PATH];
GetModuleFileName(NULL, file_path, MAX_PATH);

std::string path = GetDirectory(file_path);

path += "dump\\";

std::string file_mark = GetDumpFileMark();

path += file_mark;

return path;
}

MINIDUMP_EXCEPTION_INFORMATION GetExpParam(EXCEPTION_POINTERS* exception_pointers)
{
MINIDUMP_EXCEPTION_INFORMATION exp_param;
exp_param.ThreadId = GetCurrentThreadId();
exp_param.ExceptionPointers = exception_pointers;
exp_param.ClientPointers = TRUE;
return exp_param;
}

int GenerateDump(EXCEPTION_POINTERS* exception_pointers)
{
std::string dump_file_name = GetDumpFileName();

// The "\dump" whole directory
std::string dump_file_dir = GetDirectory(dump_file_name);

CreateDirectory(dump_file_dir.c_str(), NULL);

HANDLE dump_file_handle = CreateFile(dump_file_name.c_str(),
GENERIC_READ| GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
0, CREATE_ALWAYS, 0, 0);

MINIDUMP_EXCEPTION_INFORMATION exp_param =
GetExpParam(exception_pointers);

MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
dump_file_handle, MiniDumpNormal, &exp_param, NULL, NULL);

return 0;
}

LONG _stdcall GolbalExceptionHandler(EXCEPTION_POINTERS* exception_pointers)
{
GenerateDump(exception_pointers);
return EXCEPTION_EXECUTE_HANDLER;
}

void IntiializeMemory()
{
app_name = new std::string();
app_version = new std::string();
}

void MiniDumpBegin(const char* app_name, const char* app_version)
{
IntiializeMemory();

*minidump::app_name = app_name;
*minidump::app_version = app_version;

SetUnhandledExceptionFilter(GolbalExceptionHandler);
}
}

使用方法,在main函数开始出,调用:MiniDumpBegin函数,如图:

2. 使用注册表:

opendump.bat文件:----写注册表

@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

 

closedump.bat 文件--- 删注册表

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

使用方法:

1. 运行 opendump.bat文件
 2. 去打开服务

程序出现崩溃,C:\ 会出现:

CrashDump 文件

3. 调试dump文件 参考链接https://blog.csdn.net/tojohnonly/article/details/72864694

打开 Dump 文件

双击打开生成的 Dump 文件 , 会默认用 VS2012 打开并自动创建一个解决方案 , Dump 摘要信息如下 :

一定要确保 进程名称 对应的程序路径在本地存在 , 同时确保最初生成程序的对应 .pdb 符号文件也在当前目录 ;

有时从客户那里反馈回来的 Dump 文件程序路径和本地的不一致 , 需要将程序拷贝到 Dump 信息里面的路径中去 ;

设置 Symbols 路径

调试文件需要对应的符号文件 , 我们需要设置符号文件对应的路径 :

在 Dump 信息摘要右上角 , 点击 设置符号路径 :

推荐使用 Microsoft 符号服务器 , 但第一次在线下载会有点慢 ; 当然也可以自己下载符号集文件到某个路径 , 再讲符号路径指向该路径 :

设置源码路径

在左侧的解决方案处右键点击 属性 -> 调试源文件 , 将源代码的路径添加进来 , 注意一定是解决方案所在的路径(sln) :

调试 Dump 文件

准备工作已就绪 , 现在在 Dump 文件摘要右上角点击 使用 仅限本机 进行调试 :

如果提示 无法找到调试信息 , 或者调试信息不匹配 , 无法查找或打开 PDB 文件 , 说明没有将最初生成程序的对应 .pdb 符号文件放在调试程序所在的目录 , 或者 .pdb 符号文件与当前的程序版本不匹配 ;

程序会重现当时崩溃前的调用堆栈 , 如下图所示 :

可以看出程序已经定位到了崩溃前的那一行代码 , 非常方便排查 ;

4. 使用完成后,还原注册表,运行closedump.bat文件。

5. 删除 C盘下的 CrashDump 文件。

原文地址:https://www.cnblogs.com/20170722-kong/p/9067194.html

时间: 2024-08-02 04:13:20

windows server dump文件的相关文章

Windows Server 2008文件同步

配置Windows Server 2008文件同步 摘要: 众所周知,Linux系统可以用rsync来实现文件或目录的同步,windows系统下也一样可以.我们现在就用cwRsync来实现windows server 2008系统下的文件同步. 一.系统环境 操作系统:Windows server 2008 R2 更新源服务器 ... 众所周知,Linux系统可以用rsync来实现文件或目录的同步,windows系统下也一样可以.我们现在就用cwRsync来实现windows server 20

配置Windows server 2008文件同步[转]

众所周知,Linux系统可以用rsync来实现文件或目录的同步,windows系统下也一样可以.我们现在就用cwRsync来实现windows server 2008系统下的文件同步. 一.系统环境 操作系统:Windows server 2008 R2 更新源服务器:192.168.0.108 目的服务器:192.168.0.132 服务端:cwRsyncServer_4.1.0_Installer 客户端:cwRsync_4.1.0_Installer 二.更新源服务器安装配置(cwRsyn

windows生成dump文件

windows下程序有时突然崩溃了,偶发性的崩溃很难找.于是就需要保存崩溃时的dump信息了. 下面是关于如何生成dmp文件的代码. 头文件 #pragma once #include <windows.h> #include <DbgHelp.h> #include <stdlib.h> #include <string> #pragma comment(lib, "dbghelp.lib") namespace FrameworkMi

[精讲10] windows server 2012 文件资源管理器新功能

http://wenku.baidu.com/view/1fb115a9195f312b3069a528

浅谈Windows Server APPFABRIC

    hi,everyone !真的是好久好久没有update blog了,因为最近忙着备考,没有时间对<数据结构与算法>进行研究学习了.所以,blog一直未更新.today is Friday,心里比较轻松,(哈哈,上班族懂我的感受),有时间写篇技术文章了.正好,最近研究了一些新技术,这篇文章权当对技术的梳理归纳吧.子曰:"温故而知新,可以为师也."对于knowledge,我们一定要时常复习.thought.归纳.practice.只有这样,我们才能真正的掌握它.Ein

[精讲8] windows server 2012 Cluster功能

1-Cluster概念 群集-就是通过一组计算机提供某一个服务 特点1: 在windows server 中,只有enterprise和datacenter 版本可以提供cluster,在 2003中,最多支持8个节点,在2008 / 2008 R2 /2012中最多支持16个节点 特点2:cluster实现必须需要AD架构 特点3:至少三块网卡 ,SAN,Public,Private 特点4:cluster在实现的时候有2种模式 A/P (active passive)和A/A模式 特点5cl

Dump文件的生成和使用

1 简介 第一次遇到程序崩溃的问题,之前为单位开发了一个插件程序,在本机运行没有出现问题,但把生成的可执行文件拷贝到服务器上一运行程序,刚进入插件代码,插件服务就崩溃了,当时被这个问题整的很惨,在同事的帮助下了解到,对于程序崩溃,最快的解决方式是生成dump文件,通过生成dump文件使用调试工具进行调试,还原程序崩溃时的状态,能够起到快速定位排查问题的作用.Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种

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

一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序产生dump文件和linux程序产生dump文件的方式不一样,linux默认是不让产生core dump文件,只要在用户自己的~/.bash_profile文件中增加 ulimit -S -c unlimited > /dev/null 2>&1 这样程序崩溃就可以产生可调试的core d

Windows Server 2012下的文件迁移

对于Windows Server 2008 R2以及之前的版本的系统下,文件迁移一般会选择使用FSMT这个工具,非常好用. 最近做某部门文件迁移的项目,发现微软官方的文档介绍FSMT只支持到Windows Server 2008 R2,而此次迁移需在Windows Server 2012下完成.于是使用官方介绍的Windows Server 2012自带的服务器迁移工具:WSMT,进行文件的迁移. 服务器迁移工具,支持Windows Server 2003到Windows Server 2012