dmp文件,SetUnhandledExceptionFilter异常处理函数挂了

想在项目中使用dmp文件调试崩溃的问题,从网上找了份生成dmp文件的代码,VS2005新建一个对话框程序,写点异常代码release下运行exe,生成dmp文件,VS2005打开能显示源代码。把生成dmp的文件添加到项目里就有问题,用VS2005打开生成的dmp文件,显示的代码是SetUnhandledExceptionFilter里异常处理函数的部分,求解。附上生成dmp的代码

#pragma once

#ifndef _CRASH_DUMPER_H_
#define _CRASH_DUMPER_H_

class CrashDumper
{
public:
CrashDumper(void);
~CrashDumper(void);

public:
static bool PlaceHolder();
void        SetFilePath(TCHAR *pszFilePath);

private:
static LONG WINAPI ExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo);

private:
static TCHAR                 m_szDumpFilePath[MAX_PATH];
LPTOP_LEVEL_EXCEPTION_FILTER m_OriginalFilter;

};

namespace
{
const bool bPlaceHolder = CrashDumper::PlaceHolder();
}

#endif




#include "stdafx.h"
#include "CrashDumper.h"
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <dbghelp.h>
#include <string>
#pragma comment(lib, "dbghelp.lib")

TCHAR CrashDumper::m_szDumpFilePath[] = {0};

CrashDumper::CrashDumper()
{
TCHAR szPath[MAX_PATH] = {0};
if (GetModuleFileName(NULL, szPath, sizeof(szPath)))
{
memset(m_szDumpFilePath, 0, sizeof(m_szDumpFilePath));
wsprintf(m_szDumpFilePath, _T("%s.dmp"), szPath);
}
m_OriginalFilter = SetUnhandledExceptionFilter(ExceptionFilter);
}

CrashDumper::~CrashDumper()
{
SetUnhandledExceptionFilter(m_OriginalFilter);
}

void CrashDumper::SetFilePath(TCHAR *pszFilePath)
{
if (NULL != pszFilePath)
{
memset(m_szDumpFilePath, 0, sizeof(m_szDumpFilePath));
wsprintf(m_szDumpFilePath, _T("%s"), pszFilePath);
}
}

LONG WINAPI CrashDumper::ExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
bool bDumpOK = false;
DWORD dwProcess = GetCurrentProcessId();
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcess);
if (hProcess != INVALID_HANDLE_VALUE)
{
HANDLE hFile = CreateFile(m_szDumpFilePath, FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, NULL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION exception_information;
exception_information.ThreadId          = GetCurrentThreadId();
exception_information.ExceptionPointers = ExceptionInfo;
exception_information.ClientPointers    = TRUE;
if (MiniDumpWriteDump(hProcess, dwProcess, hFile, MiniDumpNormal, &exception_information, NULL, NULL))
{
bDumpOK = true;
}
CloseHandle(hFile);
}
CloseHandle(hProcess);
}
if (bDumpOK)
{
ATLTRACE("CrashDumper:本程序遇到未处理的异常,MiniDump文件已经生成在程序的运行目录。\r\n");
}
else
{
ATLTRACE("CrashDumper:本程序遇到未处理的异常,生成MiniDump文件失败。\r\n");
}
return EXCEPTION_EXECUTE_HANDLER;
}

bool CrashDumper::PlaceHolder()
{
return true;
}


项目里生成的dmp打开后显示在CloseHandle(hProcess);这一行,求高手指点下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值