try catch无法捕获异常设置

try catch无法捕获异常设置

项目属性修改 

 

测试代码

    try
    {
		BYTE *pch;
		pch = (BYTE *)01234; //非法地址 
		*pch = 5;
	}
	catch (const std::exception& e)
	{
		printf("msg:%s\n",e.what());
	}
	catch (...)
	{
		//打印堆栈信息
		PrintfStackInfo();
	}

打印堆栈信息代码

#pragma once
#include <vector>
#include <string>
#include <DbgHelp.h>
#pragma comment(lib,"Dbghelp.lib")

/***********************************
1.PrintfStackInfo(),可打印当前的调用堆栈信息
2.如try catch,无法捕获异常,如除0,访问非法地址等
项目属性中设置 C/C++  ->代码生成  ->启用c++异常选择“是,但有 SEH 异常 (/EHa)”
try
{
	.....
}
catch (...)
{
	PrintfStackInfo();
}
3.如多个函数嵌套,PrintfStackInfo只会打印当前函数的位置

/***********************************/
void wchar2strstring(std::string & szDst, WCHAR * wchart)
{
	wchar_t * wtext = wchart;
	DWORD dwNmu = WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, NULL, 0, NULL, FALSE);
	char * psTest;
	psTest = new char[dwNmu];
	WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, psTest, dwNmu, NULL, FALSE);
	szDst = psTest;
	delete[]psTest;
}
void ShowTraceStack(std::vector<std::string>& vInfo)
{
	vInfo.clear();
	enum
	{
		MAX_STACK_FRAMES = 16
	};

	void* arrBackTrace[MAX_STACK_FRAMES] = { 0 };

	HANDLE hProcess = GetCurrentProcess();
	SymInitialize(hProcess, NULL, TRUE);
	typedef USHORT(*PFUNRtlCaptureStackBackTrace)(
		ULONG  FramesToSkip,
		ULONG  FramesToCapture,
		PVOID* BackTrace,
		PULONG BackTraceHash
		);
	HMODULE hNt = LoadLibrary(_T("NtDll.dll"));
	PFUNRtlCaptureStackBackTrace
		pCaptureStackBackTrace = (PFUNRtlCaptureStackBackTrace)
		GetProcAddress(hNt, ("RtlCaptureStackBackTrace"));
	if (!pCaptureStackBackTrace)
	{
		vInfo.push_back("RtlCaptureStackBackTrace load failed");
		return;
	}
	CString strStackInfo;
	WORD wFrames = pCaptureStackBackTrace(0, MAX_STACK_FRAMES, arrBackTrace, NULL);

	TCHAR szBuffer[sizeof(SYMBOL_INFOW) + MAX_SYM_NAME * sizeof(TCHAR)];
	DWORD64 dwAddress = 0;
	DWORD64 dwDisplacement = 0;
	PSYMBOL_INFOW pSymbol = NULL;
	DWORD dwDisplacement2 = 0;
	IMAGEHLP_LINEW64  ilLine;
	for (WORD wIndex = 0; wIndex < wFrames; ++wIndex)
	{
		dwAddress = (DWORD64)(arrBackTrace[wIndex]);
		dwDisplacement = 0;
		pSymbol = (PSYMBOL_INFOW)szBuffer;
		pSymbol->SizeOfStruct = sizeof(SYMBOL_INFOW);
		pSymbol->MaxNameLen = MAX_SYM_NAME;

		dwDisplacement2 = 0;
		ilLine.SizeOfStruct = sizeof(IMAGEHLP_LINEW64);

		if (TRUE == SymFromAddrW(hProcess, dwAddress, &dwDisplacement, pSymbol) &&
			TRUE == SymGetLineFromAddrW64(hProcess, dwAddress, &dwDisplacement2, &ilLine))
		{
			std::string sname, sfile;
			wchar2strstring(sname, pSymbol->Name);
			wchar2strstring(sfile, ilLine.FileName);
			strStackInfo.Format(_T("FUN:%s() File:%s:[%d]"), sname.c_str(), sfile.c_str(), ilLine.LineNumber);
		}
		else
		{
			strStackInfo.Format(("query error: %d"), GetLastError());
		}
		vInfo.push_back(strStackInfo.GetBuffer());

	}
	FreeLibrary(hNt);
}
void PrintfStackInfo()
{
	printf("===========start===========\n");
	std::vector<std::string> mVStackList;
	ShowTraceStack(mVStackList);
	for (int i = 0; i < mVStackList.size(); i++)
	{
		printf("%s\n", mVStackList[i].c_str());
	}
	printf("===========end===========\n");
}

测试结果:

打印的堆栈信息中包含函数名,文件名,行号

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值