16,472
社区成员
发帖
与我相关
我的任务
分享
HANDLE process = GetCurrentProcess();
HANDLE thread = GetCurrentThread ();
CONTEXT context;
memset( &context, 0, sizeof(context) );
RtlCaptureContext( &context );
STACKFRAME sf;
memset( &sf, 0, sizeof(STACKFRAME) );
#if defined(_AMD64_)
sf.AddrPC.Offset = context.Rip;
sf.AddrPC.Mode = AddrModeFlat;
sf.AddrStack.Offset = context.Rsp;
sf.AddrStack.Mode = AddrModeFlat;
sf.AddrFrame.Offset = context.Rbp;
sf.AddrFrame.Mode = AddrModeFlat;
DWORD machineType = IMAGE_FILE_MACHINE_AMD64;
#elif defined(_IA64_)
sf.AddrPC.Offset = context.Rip;
sf.AddrPC.Mode = AddrModeFlat;
sf.AddrStack.Offset = context.Rsp;
sf.AddrStack.Mode = AddrModeFlat;
sf.AddrFrame.Offset = context.Rbp;
sf.AddrFrame.Mode = AddrModeFlat;
DWORD machineType = IMAGE_FILE_MACHINE_IA64;
#elif defined(_X86_)
sf.AddrPC.Offset = context.Eip;
sf.AddrPC.Mode = AddrModeFlat;
sf.AddrStack.Offset = context.Esp;
sf.AddrStack.Mode = AddrModeFlat;
sf.AddrFrame.Offset = context.Ebp;
sf.AddrFrame.Mode = AddrModeFlat;
DWORD machineType = IMAGE_FILE_MACHINE_I386;
#endif
for(;;)
{
#if defined(_AMD64_) || defined(_IA64_)
if( !StackWalk64(machineType, process, thread, &sf, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0) )
{
break;
}
#elif defined(_X86_)
if( !StackWalk (machineType, process, thread, &sf, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0) )
{
break;
}
#endif
if( sf.AddrFrame.Offset == 0 )
{
break;
}
BYTE symbolBuffer[sizeof(SYMBOL_INFO) + 1024];
memset( symbolBuffer, 0, sizeof(symbolBuffer) );
PSYMBOL_INFO pSymbol = reinterpret_cast<PSYMBOL_INFO>( symbolBuffer );
pSymbol -> SizeOfStruct = sizeof( SYMBOL_INFO );
pSymbol -> MaxNameLen = 1024;
if( SymFromAddr(process, sf.AddrPC.Offset, 0, pSymbol) )
{
char temp[64];
sprintf( temp, "0x%X ", pSymbol -> Address );
stack += temp;
if( pSymbol -> Name ){ stack += pSymbol -> Name;
}
stack += "\n";
}
}