stackwalker.h
Go to the documentation of this file.
1 
2 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification,
6 // are permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice,
9 // this list of conditions, and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions, and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution.
14 //
15 // 3. Neither the names of the copyright holders nor the names of their contributors
16 // may be used to endorse or promote products derived from this software without
17 // specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
26 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
28 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
29 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
30 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
31 //
32 
33 
34 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
35 // All rights reserved.
36 //
37 // Redistribution and use in source and binary forms, with or without modification,
38 // are permitted provided that the following conditions are met:
39 //
40 // 1. Redistributions of source code must retain the above copyright notice,
41 // this list of conditions, and the following disclaimer.
42 //
43 // 2. Redistributions in binary form must reproduce the above copyright notice,
44 // this list of conditions, and the following disclaimer in the documentation
45 // and/or other materials provided with the distribution.
46 //
47 // 3. Neither the names of the copyright holders nor the names of their contributors
48 // may be used to endorse or promote products derived from this software without
49 // specific prior written permission.
50 //
51 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
52 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
53 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
54 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
56 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
58 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
60 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
61 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
62 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
63 //
64 
65 /**********************************************************************
66 
67  StackWalker.h
68 
69 
70  History:
71  2005-07-27 v1 - First public release on http://www.codeproject.com/
72  (for additional changes see History in 'StackWalker.cpp'!
73 
74  **********************************************************************/
75 #ifndef STACKWALKER_H
76 #define STACKWALKER_H
77 
78 #ifndef __GNUC__
79 
80 // #pragma once is supported starting with _MCS_VER 1000,
81 // so we need not to check the version (because we only support _MSC_VER >= 1100)!
82 //#pragma once
83 
84 #include <windows.h>
85 
86 // special defines for VC5/6 (if no actual PSDK is installed):
87 #if _MSC_VER < 1300
88  typedef unsigned __int64 DWORD64, *PDWORD64;
89  #if defined(_WIN64)
90  typedef unsigned __int64 SIZE_T, *PSIZE_T;
91  #else
92  typedef unsigned long SIZE_T, *PSIZE_T;
93  #endif
94 #endif // _MSC_VER < 1300
95 
99 {
100 public:
102  {
103  // No addition info will be retrived
104  // (only the address is available)
106 
107  // Try to get the symbol-name
109 
110  // Try to get the line for this symbol
112 
113  // Try to retrieve the module-infos
115 
116  // Also retrieve the version for the DLL/EXE
118 
119  // Contains all the above
121 
122  // Generate a "good" symbol-search-path
123  SymBuildPath = 0x10,
124 
125  // Also use the public Microsoft-Symbol-Server
126  SymUseSymSrv = 0x20,
127 
128  // Contains all the abouve "Sym"-options
129  SymAll = 0x30,
130 
131  // Contains all options (default)
132  OptionsAll = 0x3F
133  };
134 
135  StackWalker(int options = (int) OptionsAll, // 'int' is by design, to combine the enum-flags
136  LPCSTR szSymPath = NULL,
137  DWORD dwProcessId = GetCurrentProcessId(),
138  HANDLE hProcess = GetCurrentProcess());
139  StackWalker(DWORD dwProcessId, HANDLE hProcess);
140  virtual ~StackWalker();
141 
142  typedef BOOL (__stdcall* PReadProcessMemoryRoutine)(
143  HANDLE hProcess,
144  DWORD64 qwBaseAddress,
145  PVOID lpBuffer,
146  DWORD nSize,
147  LPDWORD lpNumberOfBytesRead,
148  LPVOID pUserData // optional data, which was passed in "ShowCallstack"
149  );
150 
151  BOOL LoadModules();
152 
153  BOOL ShowCallstack(HANDLE hThread = GetCurrentThread(),
154  const CONTEXT* context = NULL,
155  PReadProcessMemoryRoutine readMemoryFunction = NULL,
156  LPVOID pUserData = NULL // optional to identify some data in the 'readMemoryFunction'-callback
157  );
158 
159 protected:
160  enum { STACKWALK_MAX_NAMELEN = 1024 }; // max name length for found symbols
161 
164  {
165  DWORD64 offset; // if 0, we have no valid entry
171  DWORD lineNumber;
173  DWORD symType;
178  };
179 
181 
182  virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName);
183  virtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion);
184  virtual void OnCallstackEntry(CallstackEntryType eType, CallstackEntry& entry);
185  virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr);
186  virtual void OnOutput(LPCSTR szText);
187 
189  HANDLE m_hProcess;
192  LPSTR m_szSymPath;
193 
195 
196  static BOOL __stdcall myReadProcMem(HANDLE hProcess, DWORD64 qwBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead);
197 
199  StackWalker(StackWalker const&) = delete;
200  StackWalker& operator = (StackWalker const&) = delete;
201 };
202 
203 // The "ugly" assembler-implementation is needed for systems before XP
204 // If you have a new PSDK and you only compile for XP and later, then you can use
205 // the "RtlCaptureContext"
206 // Currently there is no define which determines the PSDK-Version...
207 // So we just use the compiler-version (and assumes that the PSDK is
208 // the one which was installed by the VS-IDE)
209 
210 // INFO: If you want, you can use the RtlCaptureContext if you only target XP and later...
211 // But I currently use it in x64/IA64 environments...
212 //#if defined(_M_IX86) && (_WIN32_WINNT <= 0x0500) && (_MSC_VER < 1400)
213 
214 #if defined(_M_IX86)
215 #ifdef CURRENT_THREAD_VIA_EXCEPTION
216 // The following is not a "perfect" implementation,
217 // because the callstack is only valid in the "__except" block...
218 #define GET_CURRENT_CONTEXT(c, contextFlags) \
219  do { \
220  memset(&c, 0, sizeof(CONTEXT)); \
221  EXCEPTION_POINTERS *pExp = NULL; \
222  __try { \
223  throw 0; \
224  } __except( ( (pExp = GetExceptionInformation()) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_EXECUTE_HANDLER)) {} \
225  if (pExp != NULL) \
226  memcpy(&c, pExp->ContextRecord, sizeof(CONTEXT)); \
227  c.ContextFlags = contextFlags; \
228  } while(0)
229 #else
230 // The following should be enough for walking the callstack...
231 #define GET_CURRENT_CONTEXT(c, contextFlags) \
232  do { \
233  memset(&c, 0, sizeof(CONTEXT)); \
234  c.ContextFlags = contextFlags; \
235  __asm call x \
236  __asm x: pop eax \
237  __asm mov c.Eip, eax \
238  __asm mov c.Ebp, ebp \
239  __asm mov c.Esp, esp \
240  } while(0)
241 #endif
242 
243 #else
244 
245 // The following is defined for x86 (XP and higher), x64 and IA64:
246 #define GET_CURRENT_CONTEXT(c, contextFlags) \
247  do { \
248  memset(&c, 0, sizeof(CONTEXT)); \
249  c.ContextFlags = contextFlags; \
250  RtlCaptureContext(&c); \
251  } while(0)
252 #endif
253 
254 #endif
255 
256 #endif
StackWalker::CallstackEntry::baseOfImage
DWORD64 baseOfImage
Definition: stackwalker.h:176
StackWalker::OnDbgHelpErr
virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr)
Definition: stackwalker.cpp:1261
SIZE_T
unsigned long SIZE_T
Definition: stackwalker.h:92
StackWalker::myReadProcMem
static BOOL __stdcall myReadProcMem(HANDLE hProcess, DWORD64 qwBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead)
Definition: stackwalker.cpp:1201
StackWalker::OnCallstackEntry
virtual void OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry)
Definition: stackwalker.cpp:1237
StackWalker::RetrieveNone
@ RetrieveNone
Definition: stackwalker.h:105
StackWalker::CallstackEntry::symType
DWORD symType
Definition: stackwalker.h:173
StackWalker::RetrieveSymbol
@ RetrieveSymbol
Definition: stackwalker.h:108
StackWalker::OptionsAll
@ OptionsAll
Definition: stackwalker.h:132
StackWalker::m_sw
StackWalkerInternal * m_sw
Definition: stackwalker.h:188
StackWalker::CallstackEntry::lineNumber
DWORD lineNumber
Definition: stackwalker.h:171
StackWalker::RetrieveModuleInfo
@ RetrieveModuleInfo
Definition: stackwalker.h:114
PSIZE_T
unsigned long * PSIZE_T
Definition: stackwalker.h:92
StackWalker::OnOutput
virtual void OnOutput(LPCSTR szText)
Definition: stackwalker.cpp:1300
StackWalker::CallstackEntry::offsetFromSmybol
DWORD64 offsetFromSmybol
Definition: stackwalker.h:169
StackWalker::~StackWalker
virtual ~StackWalker()
Definition: stackwalker.cpp:841
StackWalker::CallstackEntry::undFullName
CHAR undFullName[STACKWALK_MAX_NAMELEN]
Definition: stackwalker.h:168
StackWalker::CallstackEntry::loadedImageName
CHAR loadedImageName[STACKWALK_MAX_NAMELEN]
Definition: stackwalker.h:177
StackWalker::OnLoadModule
virtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, DWORD result, LPCSTR symType, LPCSTR pdbName, ULONGLONG fileVersion)
Definition: stackwalker.cpp:1221
StackWalker::CallstackEntry::offset
DWORD64 offset
Definition: stackwalker.h:165
StackWalker::CallstackEntry::moduleName
CHAR moduleName[STACKWALK_MAX_NAMELEN]
Definition: stackwalker.h:175
StackWalker::lastEntry
@ lastEntry
Definition: stackwalker.h:180
StackWalker::CallstackEntry::symTypeString
LPCSTR symTypeString
Definition: stackwalker.h:174
StackWalker::StackWalkerInternal
friend StackWalkerInternal
Definition: stackwalker.h:198
StackWalker::RetrieveFileVersion
@ RetrieveFileVersion
Definition: stackwalker.h:117
StackWalker::StackWalker
StackWalker()
Definition: stackwalker_linux.cpp:96
StackWalkerInternal
Definition: stackwalker.cpp:263
StackWalker::m_szSymPath
LPSTR m_szSymPath
Definition: stackwalker.h:192
StackWalker::ShowCallstack
void ShowCallstack()
Definition: stackwalker_linux.cpp:104
StackWalker::RetrieveVerbose
@ RetrieveVerbose
Definition: stackwalker.h:120
PDWORD64
unsigned __int64 * PDWORD64
Definition: stackwalker.h:88
StackWalker::m_modulesLoaded
BOOL m_modulesLoaded
Definition: stackwalker.h:191
StackWalker::OnSymInit
virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName)
Definition: stackwalker.cpp:1268
DWORD64
unsigned __int64 DWORD64
Definition: stackwalker.h:88
StackWalker::nextEntry
@ nextEntry
Definition: stackwalker.h:180
StackWalker::m_hProcess
HANDLE m_hProcess
Definition: stackwalker.h:189
StackWalker::CallstackEntry::lineFileName
CHAR lineFileName[STACKWALK_MAX_NAMELEN]
Definition: stackwalker.h:172
StackWalker::CallstackEntry
Container for each Callstack-Entry.
Definition: stackwalker.h:163
StackWalker::CallstackEntry::offsetFromLine
DWORD offsetFromLine
Definition: stackwalker.h:170
StackWalker::SymAll
@ SymAll
Definition: stackwalker.h:129
StackWalker::m_dwProcessId
DWORD m_dwProcessId
Definition: stackwalker.h:190
StackWalker::PReadProcessMemoryRoutine
BOOL(__stdcall * PReadProcessMemoryRoutine)(HANDLE hProcess, DWORD64 qwBaseAddress, PVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead, LPVOID pUserData)
Definition: stackwalker.h:142
StackWalker::firstEntry
@ firstEntry
Definition: stackwalker.h:180
StackWalker::RetrieveLine
@ RetrieveLine
Definition: stackwalker.h:111
BOOL
int BOOL
Definition: xstypedefs.h:141
StackWalker::SymBuildPath
@ SymBuildPath
Definition: stackwalker.h:123
StackWalker::operator=
StackWalker & operator=(StackWalker const &)=delete
StackWalker::STACKWALK_MAX_NAMELEN
@ STACKWALK_MAX_NAMELEN
Definition: stackwalker.h:160
StackWalker::CallstackEntry::undName
CHAR undName[STACKWALK_MAX_NAMELEN]
Definition: stackwalker.h:167
StackWalker::CallstackEntryType
CallstackEntryType
Definition: stackwalker.h:180
StackWalker
A class that can help with walking the stack for debugging purposes (Windows version)
Definition: stackwalker.h:98
StackWalker::LoadModules
BOOL LoadModules()
Definition: stackwalker.cpp:851
StackWalker::m_options
int m_options
Definition: stackwalker.h:194
StackWalker::CallstackEntry::name
CHAR name[STACKWALK_MAX_NAMELEN]
Definition: stackwalker.h:166
StackWalker::SymUseSymSrv
@ SymUseSymSrv
Definition: stackwalker.h:126
LPCSTR
const typedef std::string & LPCSTR
Definition: stackwalker_linux.h:70
StackWalker::StackWalkOptions
StackWalkOptions
Definition: stackwalker.h:101


xsens_mti_driver
Author(s):
autogenerated on Sun Sep 3 2023 02:43:20