19 typedef unsigned __int64 DWORD64, *PDWORD64;
21 typedef unsigned __int64 SIZE_T, *PSIZE_T;
23 typedef unsigned long SIZE_T, *PSIZE_T;
25 #endif // _MSC_VER < 1300
27 class StackWalkerInternal;
31 typedef enum StackWalkOptions
44 RetrieveModuleInfo = 4,
47 RetrieveFileVersion = 8,
50 RetrieveVerbose = 0xF,
66 int options = OptionsAll,
67 LPCSTR szSymPath = NULL,
68 DWORD dwProcessId = GetCurrentProcessId(),
69 HANDLE hProcess = GetCurrentProcess()
71 StackWalker(DWORD dwProcessId, HANDLE hProcess);
72 virtual ~StackWalker();
74 typedef BOOL (__stdcall *PReadProcessMemoryRoutine)(
76 DWORD64 qwBaseAddress,
79 LPDWORD lpNumberOfBytesRead,
86 HANDLE hThread = GetCurrentThread(),
87 const CONTEXT *context = NULL,
88 PReadProcessMemoryRoutine readMemoryFunction = NULL,
89 LPVOID pUserData = NULL
97 enum { STACKWALK_MAX_NAMELEN = 1024 };
101 typedef struct CallstackEntry
104 CHAR name[STACKWALK_MAX_NAMELEN];
105 CHAR undName[STACKWALK_MAX_NAMELEN];
106 CHAR undFullName[STACKWALK_MAX_NAMELEN];
107 DWORD64 offsetFromSmybol;
108 DWORD offsetFromLine;
110 CHAR lineFileName[STACKWALK_MAX_NAMELEN];
112 LPCSTR symTypeString;
113 CHAR moduleName[STACKWALK_MAX_NAMELEN];
115 CHAR loadedImageName[STACKWALK_MAX_NAMELEN];
118 typedef enum CallstackEntryType {firstEntry, nextEntry, lastEntry};
120 virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName);
121 virtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion);
122 virtual void OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry);
123 virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr);
124 virtual void OnOutput(LPCSTR szText);
126 StackWalkerInternal *m_sw;
129 BOOL m_modulesLoaded;
134 static BOOL __stdcall myReadProcMem(HANDLE hProcess, DWORD64 qwBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);
136 friend StackWalkerInternal;
152 #ifdef CURRENT_THREAD_VIA_EXCEPTION
155 #define GET_CURRENT_CONTEXT(c, contextFlags) \
157 memset(&c, 0, sizeof(CONTEXT)); \
158 EXCEPTION_POINTERS *pExp = NULL; \
161 } __except( ( (pExp = GetExceptionInformation()) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_EXECUTE_HANDLER)) {} \
163 memcpy(&c, pExp->ContextRecord, sizeof(CONTEXT)); \
164 c.ContextFlags = contextFlags; \
168 #define GET_CURRENT_CONTEXT(c, contextFlags) \
170 memset(&c, 0, sizeof(CONTEXT)); \
171 c.ContextFlags = contextFlags; \
174 __asm mov c.Eip, eax \
175 __asm mov c.Ebp, ebp \
176 __asm mov c.Esp, esp \
183 #define GET_CURRENT_CONTEXT(c, contextFlags) \
185 memset(&c, 0, sizeof(CONTEXT)); \
186 c.ContextFlags = contextFlags; \
187 RtlCaptureContext(&c); \
191 class StackTrace :
public StackWalker
194 StackTrace() : StackWalker()
199 const std::string & toString()
const
205 virtual void OnOutput(LPCSTR szText)
210 virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
214 virtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size,
215 DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion)
224 virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr)