VC 获取当前函数的调用堆栈

本文展示了一段C++代码,用于实现堆栈跟踪功能,通过使用DbgHelp库和RtlCaptureStackBackTrace函数获取调用堆栈信息,解析并记录函数调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码吧:


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

void ShowTraceStack( )
{
	enum
	{
		MAX_STACK_FRAMES = 16
	};

	void* arrBackTrace[MAX_STACK_FRAMES] = { 0 };
	CString  strStackInfo = _T("calling stack-trace:\n");

	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)
	{
		xxGlobal::LogEvent(LOG_LEVEL_INFO, _T("RtlCaptureStackBackTrace load failed") );
		return;
	}

	WORD wFrames = pCaptureStackBackTrace(0, MAX_STACK_FRAMES, arrBackTrace, NULL);
	

	xxGlobal::LogEvent(LOG_LEVEL_INFO, strStackInfo);

	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))
		{
			strStackInfo.Format( _T("\t%s() at %s:%d(0x%x)\n"),
				pSymbol->Name, 
				ilLine.FileName, ilLine.LineNumber, pSymbol->Address );
		}
		else
		{
			strStackInfo.Format( _T("\tquery error: %d\n"), GetLastError());
		}
		xxGlobal::LogEvent(LOG_LEVEL_INFO, strStackInfo);

	}
	FreeLibrary(hNt);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值