#include "CallStack.h" void ShowCallStack () { HANDLE hProc = GetCurrentProcess () ; HANDLE hThr = GetCurrentThread () ; CONTEXT ctCtx ; ctCtx.ContextFlags = CONTEXT_FULL ; if (! GetThreadContext ( hThr, & ctCtx ) ) { cout << "Error ! Call stack can't be displayed\n" ; return ; } STACKFRAME64 sfStckFrm ; ZeroMemory ( & sfStckFrm, sizeof(STACKFRAME64) ) ; sfStckFrm.AddrPC.Mode = AddrModeFlat ; sfStckFrm.AddrStack.Mode = AddrModeFlat ; sfStckFrm.AddrFrame.Mode = AddrModeFlat ; sfStckFrm.AddrPC.Offset = ctCtx.Eip ; sfStckFrm.AddrStack.Offset = ctCtx.Esp ; sfStckFrm.AddrFrame.Offset = ctCtx.Ebp ; if ( SymInitialize ( hProc, NULL, TRUE ) == FALSE ) { cout << "Error ! Debug Symbols could not be loaded\n" ; return ; } while ( StackWalk64 ( IMAGE_FILE_MACHINE_I386, hProc, hThr, & sfStckFrm, (PVOID) & ctCtx, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL ) ) { cout << setw(15) << left << "EIP" << " : 0x" << hex << sfStckFrm.AddrPC.Offset << endl << setw(15) << left << "ESP" << " : 0x" << hex << sfStckFrm.AddrStack.Offset << endl << setw(15) << left << "EBP" << " : 0x" << hex << sfStckFrm.AddrFrame.Offset << endl << setw(15) << left << "Return Addr" << " : 0x" << hex << sfStckFrm.AddrReturn.Offset << endl ; if ( sfStckFrm.AddrPC.Offset != 0 ) { char * szSym = new char [1024] ; PSYMBOL_INFO pSi = (PSYMBOL_INFO) szSym ; pSi->SizeOfStruct = sizeof (PSYMBOL_INFO) ; pSi->MaxNameLen = 1024 - sizeof (PSYMBOL_INFO) ; DWORD64 dwDispl = 0 ; if (SymFromAddr(hProc,sfStckFrm.AddrPC.Offset,&dwDispl,pSi)) cout << "Function : " << pSi->Name ; cout << endl << endl ; } } if ( ! SymCleanup ( hProc ) ) { cout << "Error ! Debug Symbols could not be unloaded\n" ; return ; } CloseHandle (hProc); CloseHandle (hThr); } //**************************************************************// void AnotherApp :: AnotherBaz ( ) { ShowCallStack () ; } void AnotherApp :: AnotherBar ( ) { AnotherBaz ( ) ; } void AnotherApp :: AnotherFoo ( ) { AnotherBar ( ) ; } void Baz ( ) { AnotherApp anapp ; anapp.AnotherFoo() ; } void Bar ( ) { Baz ( ) ; } void Foo ( ) { static int i = 0 ; if (i < 2) { ++i ; Foo () ; } else Bar ( ) ; } void main ( ) { Foo ( ) ; }