├── .clang-format ├── CMakeLists.txt ├── CODE_OF_CONDUCT.md ├── LICENSE ├── Main └── StackWalker │ ├── .gitignore │ ├── StackWalker.cpp │ ├── StackWalker.h │ ├── StackWalker_VC2010.sln │ ├── StackWalker_VC2010.vcxproj │ ├── StackWalker_VC2010.vcxproj.filters │ ├── StackWalker_VC2010.vcxproj.vspscc │ ├── StackWalker_VC2015.sln │ ├── StackWalker_VC2015.vcxproj │ ├── StackWalker_VC2015.vcxproj.filters │ ├── StackWalker_VC2015.vcxproj.vspscc │ ├── StackWalker_VC2017.sln │ ├── StackWalker_VC2017.vcxproj │ ├── StackWalker_VC2017.vcxproj.filters │ ├── StackWalker_VC2017.vcxproj.vspscc │ ├── StackWalker_VC2022.sln │ ├── StackWalker_VC2022.vcxproj │ ├── StackWalker_VC2022.vcxproj.filters │ ├── StackWalker_VC2022.vcxproj.vspscc │ ├── StackWalker_VC5.dsp │ ├── StackWalker_VC5.dsw │ ├── StackWalker_VC6.dsp │ ├── StackWalker_VC6.dsw │ ├── StackWalker_VC70.sln │ ├── StackWalker_VC70.vcproj │ ├── StackWalker_VC71.sln │ ├── StackWalker_VC71.vcproj │ ├── StackWalker_VC8.sln │ ├── StackWalker_VC8.vcproj │ ├── StackWalker_VC9.sln │ ├── StackWalker_VC9.vcproj │ ├── StackWalker_VC9.vcproj.vspscc │ ├── StackWalker_VC9.vssscc │ ├── main.cpp │ └── makefile ├── README.md └── appveyor.yml /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | BasedOnStyle: LLVM 3 | IndentWidth: 2 4 | --- 5 | Language: Cpp 6 | UseTab: Never 7 | ColumnLimit: 100 8 | AlignAfterOpenBracket: true 9 | BreakBeforeBraces: Allman 10 | AllowShortFunctionsOnASingleLine: InlineOnly 11 | ReflowComments: false 12 | BinPackParameters: false 13 | AlignEscapedNewlines: Right 14 | PointerAlignment: Left 15 | AlignConsecutiveDeclarations: true 16 | AlignEscapedNewlines: true 17 | IndentCaseLabels: true 18 | ... 19 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | project(StackWalker-project) 2 | 3 | cmake_minimum_required(VERSION 3.10) 4 | 5 | if(NOT CMAKE_BUILD_TYPE) 6 | set(CMAKE_BUILD_TYPE Release) 7 | #set(CMAKE_BUILD_TYPE Debug) 8 | endif() 9 | 10 | 11 | option(StackWalker_DISABLE_TESTS "Disable tests" OFF) 12 | 13 | 14 | ############################### 15 | # Check compiler's capabilities 16 | ############################### 17 | 18 | include (CheckCXXCompilerFlag) 19 | 20 | if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") 21 | set (CMAKE_COMPILER_IS_CLANG true) 22 | elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") 23 | set (CMAKE_COMPILER_IS_MSVC true) 24 | endif() 25 | 26 | if(CMAKE_COMPILER_IS_MSVC) 27 | # MSVC_TOOLSET_VERSION is only available from cmake 3.12 28 | # --> https://cmake.org/cmake/help/v3.12/variable/MSVC_TOOLSET_VERSION.html 29 | # --> https://gitlab.kitware.com/KindDragon/cmake/commit/f2a61e0a4790d4d52a2412c8017be2b92e9af26f?view=inline 30 | if(NOT DEFINED MSVC_TOOLSET_VERSION) 31 | if(MSVC_VERSION GREATER_EQUAL 1920) 32 | set(MSVC_TOOLSET_VERSION "") # leave unknown 33 | elseif(MSVC_VERSION GREATER_EQUAL 1910) 34 | # VS 2017 35 | set(MSVC_TOOLSET_VERSION 141) 36 | elseif(MSVC_VERSION EQUAL 1900) 37 | # VS 2015 38 | set(MSVC_TOOLSET_VERSION 140) 39 | elseif(MSVC_VERSION EQUAL 1800) 40 | # VS 2013 41 | set(MSVC_TOOLSET_VERSION 120) 42 | elseif(MSVC_VERSION EQUAL 1700) 43 | # VS 2012 44 | set(MSVC_TOOLSET_VERSION 110) 45 | elseif(MSVC_VERSION EQUAL 1600) 46 | # VS 2010 47 | set(MSVC_TOOLSET_VERSION 100) 48 | elseif(MSVC_VERSION EQUAL 1500) 49 | # VS 2008 50 | set(MSVC_TOOLSET_VERSION 90) 51 | elseif(MSVC_VERSION EQUAL 1400) 52 | # VS 2005 53 | set(MSVC_TOOLSET_VERSION 80) 54 | else() 55 | # We don't support MSVC_TOOLSET_VERSION for earlier compiler. 56 | endif() 57 | endif() 58 | 59 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") 60 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SECURE_SCL=0") 61 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_DEPRECATE") 62 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_NONSTDC_NO_DEPRECATE") 63 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_SCL_SECURE_NO_DEPRECATE") 64 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Zi") 65 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4740") 66 | else() 67 | message(FATAL_ERROR "${CMAKE_CXX_COMPILER_ID} is not supported yet") 68 | endif() 69 | 70 | message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") 71 | set (CMAKE_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include") 72 | set (CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib") 73 | set (CMAKE_INSTALL_BINDIR "${CMAKE_INSTALL_PREFIX}/bin") 74 | message(STATUS "CMAKE_INSTALL_INCLUDEDIR: ${CMAKE_INSTALL_INCLUDEDIR}") 75 | message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}") 76 | message(STATUS "CMAKE_INSTALL_BINDIR: ${CMAKE_INSTALL_BINDIR}") 77 | 78 | set(TARGET_StackWalker StackWalker) 79 | add_library(${TARGET_StackWalker} STATIC 80 | Main/StackWalker/StackWalker.cpp) 81 | target_include_directories(${TARGET_StackWalker} PUBLIC 82 | $ 83 | ) 84 | 85 | install(TARGETS "${TARGET_StackWalker}" 86 | ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 87 | LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 88 | RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 89 | ) 90 | 91 | install(FILES "${CMAKE_SOURCE_DIR}/Main/StackWalker/StackWalker.h" 92 | DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 93 | 94 | if (MSVC_VERSION GREATER_EQUAL 1900) 95 | set(PDB_StackWalker "${TARGET_StackWalker}.pdb") 96 | else() 97 | set(PDB_StackWalker "vc${MSVC_TOOLSET_VERSION}.pdb") 98 | endif() 99 | install(FILES 100 | "${CMAKE_CURRENT_BINARY_DIR}/${TARGET_StackWalker}.dir/$\{CMAKE_INSTALL_CONFIG_NAME\}/${PDB_StackWalker}" 101 | DESTINATION ${CMAKE_INSTALL_LIBDIR} 102 | RENAME "${TARGET_StackWalker}.pdb" 103 | OPTIONAL) 104 | 105 | 106 | if (StackWalker_DISABLE_TESTS) 107 | message(STATUS "Skipping tests") 108 | else() 109 | enable_testing() 110 | 111 | set(TARGET_StackWalker_tests StackWalker_test) 112 | add_executable(${TARGET_StackWalker_tests} 113 | Main/StackWalker/main.cpp) 114 | target_link_libraries(${TARGET_StackWalker_tests} PUBLIC ${TARGET_StackWalker}) 115 | 116 | add_test(NAME ${TARGET_StackWalker_tests} COMMAND ${TARGET_StackWalker_tests}) 117 | endif() 118 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at jochen add kalmbachnet dott de. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD-2-Clause 2 | 3 | Copyright (c) 2005 - 2019, Jochen Kalmbach 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /Main/StackWalker/.gitignore: -------------------------------------------------------------------------------- 1 | /*.suo 2 | /*.user 3 | /*.sdf 4 | /*.opensdf 5 | /Debug_* 6 | /Release_* 7 | /x64 8 | /arm64 9 | /Itanium 10 | /ipch 11 | /.vs 12 | /*.vc.db 13 | /*.vc.opendb 14 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker.h: -------------------------------------------------------------------------------- 1 | #ifndef __STACKWALKER_H__ 2 | #define __STACKWALKER_H__ 3 | 4 | #if defined(_MSC_VER) 5 | 6 | /********************************************************************** 7 | * 8 | * StackWalker.h 9 | * 10 | * 11 | * 12 | * LICENSE (http://www.opensource.org/licenses/bsd-license.php) 13 | * 14 | * Copyright (c) 2005-2009, Jochen Kalmbach 15 | * All rights reserved. 16 | * 17 | * Redistribution and use in source and binary forms, with or without modification, 18 | * are permitted provided that the following conditions are met: 19 | * 20 | * Redistributions of source code must retain the above copyright notice, 21 | * this list of conditions and the following disclaimer. 22 | * Redistributions in binary form must reproduce the above copyright notice, 23 | * this list of conditions and the following disclaimer in the documentation 24 | * and/or other materials provided with the distribution. 25 | * Neither the name of Jochen Kalmbach nor the names of its contributors may be 26 | * used to endorse or promote products derived from this software without 27 | * specific prior written permission. 28 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 29 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 30 | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 31 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 32 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 33 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 34 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 35 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 37 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38 | * 39 | * **********************************************************************/ 40 | // #pragma once is supported starting with _MSC_VER 1000, 41 | // so we need not to check the version (because we only support _MSC_VER >= 1100)! 42 | #pragma once 43 | 44 | #include 45 | 46 | // special defines for VC5/6 (if no actual PSDK is installed): 47 | #if _MSC_VER < 1300 48 | typedef unsigned __int64 DWORD64, *PDWORD64; 49 | #if defined(_WIN64) 50 | typedef unsigned __int64 SIZE_T, *PSIZE_T; 51 | #else 52 | typedef unsigned long SIZE_T, *PSIZE_T; 53 | #endif 54 | #endif // _MSC_VER < 1300 55 | 56 | class StackWalkerInternal; // forward 57 | class StackWalker 58 | { 59 | public: 60 | typedef enum ExceptType 61 | { 62 | NonExcept = 0, // RtlCaptureContext 63 | AfterExcept = 1, 64 | AfterCatch = 2, // get_current_exception_context 65 | } ExceptType; 66 | 67 | typedef enum StackWalkOptions 68 | { 69 | // No addition info will be retrieved 70 | // (only the address is available) 71 | RetrieveNone = 0, 72 | 73 | // Try to get the symbol-name 74 | RetrieveSymbol = 1, 75 | 76 | // Try to get the line for this symbol 77 | RetrieveLine = 2, 78 | 79 | // Try to retrieve the module-infos 80 | RetrieveModuleInfo = 4, 81 | 82 | // Also retrieve the version for the DLL/EXE 83 | RetrieveFileVersion = 8, 84 | 85 | // Contains all the above 86 | RetrieveVerbose = 0xF, 87 | 88 | // Generate a "good" symbol-search-path 89 | SymBuildPath = 0x10, 90 | 91 | // Also use the public Microsoft-Symbol-Server 92 | SymUseSymSrv = 0x20, 93 | 94 | // Contains all the above "Sym"-options 95 | SymAll = 0x30, 96 | 97 | // Contains all options (default) 98 | OptionsAll = 0x3F 99 | } StackWalkOptions; 100 | 101 | StackWalker(ExceptType extype, int options = OptionsAll, PEXCEPTION_POINTERS exp = NULL); 102 | 103 | StackWalker(int options = OptionsAll, // 'int' is by design, to combine the enum-flags 104 | LPCSTR szSymPath = NULL, 105 | DWORD dwProcessId = GetCurrentProcessId(), 106 | HANDLE hProcess = GetCurrentProcess()); 107 | 108 | StackWalker(DWORD dwProcessId, HANDLE hProcess); 109 | 110 | virtual ~StackWalker(); 111 | 112 | bool SetSymPath(LPCSTR szSymPath); 113 | 114 | bool SetTargetProcess(DWORD dwProcessId, HANDLE hProcess); 115 | 116 | PCONTEXT GetCurrentExceptionContext(); 117 | 118 | private: 119 | bool Init(ExceptType extype, int options, LPCSTR szSymPath, DWORD dwProcessId, 120 | HANDLE hProcess, PEXCEPTION_POINTERS exp = NULL); 121 | 122 | public: 123 | typedef BOOL(__stdcall* PReadProcessMemoryRoutine)( 124 | HANDLE hProcess, 125 | DWORD64 qwBaseAddress, 126 | PVOID lpBuffer, 127 | DWORD nSize, 128 | LPDWORD lpNumberOfBytesRead, 129 | LPVOID pUserData // optional data, which was passed in "ShowCallstack" 130 | ); 131 | 132 | BOOL LoadModules(); 133 | 134 | BOOL ShowCallstack( 135 | HANDLE hThread = GetCurrentThread(), 136 | const CONTEXT* context = NULL, 137 | PReadProcessMemoryRoutine readMemoryFunction = NULL, 138 | LPVOID pUserData = NULL // optional to identify some data in the 'readMemoryFunction'-callback 139 | ); 140 | 141 | BOOL ShowObject(LPVOID pObject); 142 | 143 | #if _MSC_VER >= 1300 144 | // due to some reasons, the "STACKWALK_MAX_NAMELEN" must be declared as "public" 145 | // in older compilers in order to use it... starting with VC7 we can declare it as "protected" 146 | protected: 147 | #endif 148 | enum 149 | { 150 | STACKWALK_MAX_NAMELEN = 1024 151 | }; // max name length for found symbols 152 | 153 | protected: 154 | // Entry for each Callstack-Entry 155 | typedef struct CallstackEntry 156 | { 157 | DWORD64 offset; // if 0, we have no valid entry 158 | CHAR name[STACKWALK_MAX_NAMELEN]; 159 | CHAR undName[STACKWALK_MAX_NAMELEN]; 160 | CHAR undFullName[STACKWALK_MAX_NAMELEN]; 161 | DWORD64 offsetFromSmybol; 162 | DWORD offsetFromLine; 163 | DWORD lineNumber; 164 | CHAR lineFileName[STACKWALK_MAX_NAMELEN]; 165 | DWORD symType; 166 | LPCSTR symTypeString; 167 | CHAR moduleName[STACKWALK_MAX_NAMELEN]; 168 | DWORD64 baseOfImage; 169 | CHAR loadedImageName[STACKWALK_MAX_NAMELEN]; 170 | } CallstackEntry; 171 | 172 | typedef enum CallstackEntryType 173 | { 174 | firstEntry, 175 | nextEntry, 176 | lastEntry 177 | } CallstackEntryType; 178 | 179 | virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName); 180 | virtual void OnLoadModule(LPCSTR img, 181 | LPCSTR mod, 182 | DWORD64 baseAddr, 183 | DWORD size, 184 | DWORD result, 185 | LPCSTR symType, 186 | LPCSTR pdbName, 187 | ULONGLONG fileVersion); 188 | virtual void OnCallstackEntry(CallstackEntryType eType, CallstackEntry& entry); 189 | virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr); 190 | virtual void OnOutput(LPCSTR szText); 191 | 192 | StackWalkerInternal* m_sw; 193 | HANDLE m_hProcess; 194 | DWORD m_dwProcessId; 195 | BOOL m_modulesLoaded; 196 | LPSTR m_szSymPath; 197 | 198 | int m_options; 199 | int m_MaxRecursionCount; 200 | 201 | static BOOL __stdcall myReadProcMem(HANDLE hProcess, 202 | DWORD64 qwBaseAddress, 203 | PVOID lpBuffer, 204 | DWORD nSize, 205 | LPDWORD lpNumberOfBytesRead); 206 | 207 | friend StackWalkerInternal; 208 | }; // class StackWalker 209 | 210 | // The "ugly" assembler-implementation is needed for systems before XP 211 | // If you have a new PSDK and you only compile for XP and later, then you can use 212 | // the "RtlCaptureContext" 213 | // Currently there is no define which determines the PSDK-Version... 214 | // So we just use the compiler-version (and assumes that the PSDK is 215 | // the one which was installed by the VS-IDE) 216 | 217 | // INFO: If you want, you can use the RtlCaptureContext if you only target XP and later... 218 | // But I currently use it in x64/IA64 environments... 219 | //#if defined(_M_IX86) && (_WIN32_WINNT <= 0x0500) && (_MSC_VER < 1400) 220 | 221 | #if defined(_M_IX86) 222 | #ifdef CURRENT_THREAD_VIA_EXCEPTION 223 | // TODO: The following is not a "good" implementation, 224 | // because the callstack is only valid in the "__except" block... 225 | #define GET_CURRENT_CONTEXT_STACKWALKER_CODEPLEX(c, contextFlags) \ 226 | do \ 227 | { \ 228 | memset(&c, 0, sizeof(CONTEXT)); \ 229 | EXCEPTION_POINTERS* pExp = NULL; \ 230 | __try \ 231 | { \ 232 | throw 0; \ 233 | } \ 234 | __except (((pExp = GetExceptionInformation()) ? EXCEPTION_EXECUTE_HANDLER \ 235 | : EXCEPTION_EXECUTE_HANDLER)) \ 236 | { \ 237 | } \ 238 | if (pExp != NULL) \ 239 | memcpy(&c, pExp->ContextRecord, sizeof(CONTEXT)); \ 240 | c.ContextFlags = contextFlags; \ 241 | } while (0); 242 | #else 243 | // clang-format off 244 | // The following should be enough for walking the callstack... 245 | #define GET_CURRENT_CONTEXT_STACKWALKER_CODEPLEX(c, contextFlags) \ 246 | do \ 247 | { \ 248 | memset(&c, 0, sizeof(CONTEXT)); \ 249 | c.ContextFlags = contextFlags; \ 250 | __asm call x \ 251 | __asm x: pop eax \ 252 | __asm mov c.Eip, eax \ 253 | __asm mov c.Ebp, ebp \ 254 | __asm mov c.Esp, esp \ 255 | } while (0) 256 | // clang-format on 257 | #endif 258 | 259 | #else 260 | 261 | // The following is defined for x86 (XP and higher), x64 and IA64: 262 | #define GET_CURRENT_CONTEXT_STACKWALKER_CODEPLEX(c, contextFlags) \ 263 | do \ 264 | { \ 265 | memset(&c, 0, sizeof(CONTEXT)); \ 266 | c.ContextFlags = contextFlags; \ 267 | RtlCaptureContext(&c); \ 268 | } while (0); 269 | #endif 270 | 271 | #endif //defined(_MSC_VER) 272 | 273 | #endif // __STACKWALKER_H__ 274 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2010.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 11.00 2 | # Visual Studio 2010 3 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker_VC2010", "StackWalker_VC2010.vcxproj", "{89B2BD42-B130-4811-9043-71A8EBC40DE5}" 4 | EndProject 5 | Global 6 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 7 | Debug_VC2010|Itanium = Debug_VC2010|Itanium 8 | Debug_VC2010|Win32 = Debug_VC2010|Win32 9 | Debug_VC2010|x64 = Debug_VC2010|x64 10 | Debug_VC2010-UNICODE|Itanium = Debug_VC2010-UNICODE|Itanium 11 | Debug_VC2010-UNICODE|Win32 = Debug_VC2010-UNICODE|Win32 12 | Debug_VC2010-UNICODE|x64 = Debug_VC2010-UNICODE|x64 13 | Release_VC2010|Itanium = Release_VC2010|Itanium 14 | Release_VC2010|Win32 = Release_VC2010|Win32 15 | Release_VC2010|x64 = Release_VC2010|x64 16 | Release_VC2010-UNICODE|Itanium = Release_VC2010-UNICODE|Itanium 17 | Release_VC2010-UNICODE|Win32 = Release_VC2010-UNICODE|Win32 18 | Release_VC2010-UNICODE|x64 = Release_VC2010-UNICODE|x64 19 | EndGlobalSection 20 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 21 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010|Itanium.ActiveCfg = Debug_VC2010|Itanium 22 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010|Itanium.Build.0 = Debug_VC2010|Itanium 23 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010|Win32.ActiveCfg = Debug_VC2010|Win32 24 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010|Win32.Build.0 = Debug_VC2010|Win32 25 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010|x64.ActiveCfg = Debug_VC2010|x64 26 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010|x64.Build.0 = Debug_VC2010|x64 27 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010-UNICODE|Itanium.ActiveCfg = Debug_VC2010-UNICODE|Itanium 28 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010-UNICODE|Itanium.Build.0 = Debug_VC2010-UNICODE|Itanium 29 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010-UNICODE|Win32.ActiveCfg = Debug_VC2010-UNICODE|Win32 30 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010-UNICODE|Win32.Build.0 = Debug_VC2010-UNICODE|Win32 31 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010-UNICODE|x64.ActiveCfg = Debug_VC2010-UNICODE|x64 32 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2010-UNICODE|x64.Build.0 = Debug_VC2010-UNICODE|x64 33 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010|Itanium.ActiveCfg = Release_VC2010|Itanium 34 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010|Itanium.Build.0 = Release_VC2010|Itanium 35 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010|Win32.ActiveCfg = Release_VC2010|Win32 36 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010|Win32.Build.0 = Release_VC2010|Win32 37 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010|x64.ActiveCfg = Release_VC2010|x64 38 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010|x64.Build.0 = Release_VC2010|x64 39 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010-UNICODE|Itanium.ActiveCfg = Release_VC2010-UNICODE|Itanium 40 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010-UNICODE|Itanium.Build.0 = Release_VC2010-UNICODE|Itanium 41 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010-UNICODE|Win32.ActiveCfg = Release_VC2010-UNICODE|Win32 42 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010-UNICODE|Win32.Build.0 = Release_VC2010-UNICODE|Win32 43 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010-UNICODE|x64.ActiveCfg = Release_VC2010-UNICODE|x64 44 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2010-UNICODE|x64.Build.0 = Release_VC2010-UNICODE|x64 45 | EndGlobalSection 46 | GlobalSection(SolutionProperties) = preSolution 47 | HideSolutionNode = FALSE 48 | EndGlobalSection 49 | EndGlobal 50 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2010.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug_VC2010-UNICODE 6 | Itanium 7 | 8 | 9 | Debug_VC2010-UNICODE 10 | Win32 11 | 12 | 13 | Debug_VC2010-UNICODE 14 | x64 15 | 16 | 17 | Debug_VC2010 18 | Itanium 19 | 20 | 21 | Debug_VC2010 22 | Win32 23 | 24 | 25 | Debug_VC2010 26 | x64 27 | 28 | 29 | Release_VC2010-UNICODE 30 | Itanium 31 | 32 | 33 | Release_VC2010-UNICODE 34 | Win32 35 | 36 | 37 | Release_VC2010-UNICODE 38 | x64 39 | 40 | 41 | Release_VC2010 42 | Itanium 43 | 44 | 45 | Release_VC2010 46 | Win32 47 | 48 | 49 | Release_VC2010 50 | x64 51 | 52 | 53 | 54 | {89B2BD42-B130-4811-9043-71A8EBC40DE5} 55 | StackWalker_VC2010 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | Win32Proj 65 | 66 | 67 | 68 | Application 69 | Unicode 70 | 71 | 72 | Application 73 | Unicode 74 | 75 | 76 | Application 77 | MultiByte 78 | 79 | 80 | Application 81 | MultiByte 82 | 83 | 84 | Application 85 | Unicode 86 | 87 | 88 | Application 89 | Unicode 90 | 91 | 92 | Application 93 | MultiByte 94 | 95 | 96 | Application 97 | MultiByte 98 | 99 | 100 | Application 101 | Unicode 102 | 103 | 104 | Application 105 | Unicode 106 | 107 | 108 | Application 109 | MultiByte 110 | 111 | 112 | Application 113 | MultiByte 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | <_ProjectFileVersion>10.0.30319.1 157 | $(Configuration)\ 158 | $(Configuration)\ 159 | true 160 | $(Platform)\$(Configuration)\ 161 | $(Platform)\$(Configuration)\ 162 | true 163 | $(Platform)\$(Configuration)\ 164 | $(Platform)\$(Configuration)\ 165 | true 166 | $(Configuration)\ 167 | $(Configuration)\ 168 | false 169 | $(Platform)\$(Configuration)\ 170 | $(Platform)\$(Configuration)\ 171 | false 172 | $(Platform)\$(Configuration)\ 173 | $(Platform)\$(Configuration)\ 174 | false 175 | $(Configuration)\ 176 | $(Configuration)\ 177 | true 178 | $(Platform)\$(Configuration)\ 179 | $(Platform)\$(Configuration)\ 180 | true 181 | $(Platform)\$(Configuration)\ 182 | $(Platform)\$(Configuration)\ 183 | true 184 | $(Configuration)\ 185 | $(Configuration)\ 186 | false 187 | $(Platform)\$(Configuration)\ 188 | $(Platform)\$(Configuration)\ 189 | false 190 | $(Platform)\$(Configuration)\ 191 | $(Platform)\$(Configuration)\ 192 | false 193 | AllRules.ruleset 194 | 195 | 196 | AllRules.ruleset 197 | 198 | 199 | AllRules.ruleset 200 | 201 | 202 | AllRules.ruleset 203 | 204 | 205 | AllRules.ruleset 206 | 207 | 208 | AllRules.ruleset 209 | 210 | 211 | AllRules.ruleset 212 | 213 | 214 | AllRules.ruleset 215 | 216 | 217 | AllRules.ruleset 218 | 219 | 220 | AllRules.ruleset 221 | 222 | 223 | AllRules.ruleset 224 | 225 | 226 | AllRules.ruleset 227 | 228 | 229 | 230 | 231 | 232 | Disabled 233 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 234 | true 235 | EnableFastChecks 236 | MultiThreadedDebug 237 | 238 | 239 | Level3 240 | EditAndContinue 241 | 242 | 243 | true 244 | $(OutDir)StackWalker.pdb 245 | Console 246 | false 247 | 248 | 249 | MachineX86 250 | 251 | 252 | 253 | 254 | Itanium 255 | 256 | 257 | Disabled 258 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 259 | true 260 | EnableFastChecks 261 | MultiThreadedDebug 262 | 263 | 264 | Level3 265 | ProgramDatabase 266 | 267 | 268 | true 269 | $(OutDir)StackWalker.pdb 270 | Console 271 | false 272 | 273 | 274 | MachineIA64 275 | 276 | 277 | 278 | 279 | X64 280 | 281 | 282 | Disabled 283 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 284 | true 285 | EnableFastChecks 286 | MultiThreadedDebug 287 | 288 | 289 | Level3 290 | ProgramDatabase 291 | 292 | 293 | true 294 | $(OutDir)StackWalker.pdb 295 | Console 296 | false 297 | 298 | 299 | MachineX64 300 | 301 | 302 | 303 | 304 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 305 | MultiThreaded 306 | 307 | 308 | Level3 309 | ProgramDatabase 310 | 311 | 312 | true 313 | Console 314 | true 315 | true 316 | false 317 | 318 | 319 | MachineX86 320 | 321 | 322 | 323 | 324 | Itanium 325 | 326 | 327 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 328 | MultiThreaded 329 | 330 | 331 | Level3 332 | ProgramDatabase 333 | 334 | 335 | true 336 | Console 337 | true 338 | true 339 | false 340 | 341 | 342 | MachineIA64 343 | 344 | 345 | 346 | 347 | X64 348 | 349 | 350 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 351 | MultiThreaded 352 | 353 | 354 | Level3 355 | ProgramDatabase 356 | 357 | 358 | true 359 | Console 360 | true 361 | true 362 | false 363 | 364 | 365 | MachineX64 366 | 367 | 368 | 369 | 370 | Disabled 371 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 372 | true 373 | EnableFastChecks 374 | MultiThreadedDebug 375 | 376 | 377 | Level3 378 | EditAndContinue 379 | 380 | 381 | true 382 | $(OutDir)StackWalker.pdb 383 | Console 384 | false 385 | 386 | 387 | MachineX86 388 | 389 | 390 | 391 | 392 | Itanium 393 | 394 | 395 | Disabled 396 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 397 | true 398 | EnableFastChecks 399 | MultiThreadedDebug 400 | 401 | 402 | Level3 403 | ProgramDatabase 404 | 405 | 406 | true 407 | $(OutDir)StackWalker.pdb 408 | Console 409 | false 410 | 411 | 412 | MachineIA64 413 | 414 | 415 | 416 | 417 | X64 418 | 419 | 420 | Disabled 421 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 422 | true 423 | EnableFastChecks 424 | MultiThreadedDebug 425 | 426 | 427 | Level3 428 | ProgramDatabase 429 | 430 | 431 | true 432 | $(OutDir)StackWalker.pdb 433 | Console 434 | false 435 | 436 | 437 | MachineX64 438 | 439 | 440 | 441 | 442 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 443 | MultiThreaded 444 | 445 | 446 | Level3 447 | ProgramDatabase 448 | 449 | 450 | true 451 | Console 452 | true 453 | true 454 | false 455 | 456 | 457 | MachineX86 458 | 459 | 460 | 461 | 462 | Itanium 463 | 464 | 465 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 466 | MultiThreaded 467 | 468 | 469 | Level3 470 | ProgramDatabase 471 | 472 | 473 | true 474 | Console 475 | true 476 | true 477 | false 478 | 479 | 480 | MachineIA64 481 | 482 | 483 | 484 | 485 | X64 486 | 487 | 488 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 489 | MultiThreaded 490 | 491 | 492 | Level3 493 | ProgramDatabase 494 | 495 | 496 | true 497 | Console 498 | true 499 | true 500 | false 501 | 502 | 503 | MachineX64 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2010.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | 26 | 27 | Header Files 28 | 29 | 30 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2010.vcxproj.vspscc: -------------------------------------------------------------------------------- 1 | "" 2 | { 3 | "FILE_VERSION" = "9237" 4 | "ENLISTMENT_CHOICE" = "NEVER" 5 | "PROJECT_FILE_RELATIVE_PATH" = "" 6 | "NUMBER_OF_EXCLUDED_FILES" = "0" 7 | "ORIGINAL_PROJECT_FILE_PATH" = "" 8 | "NUMBER_OF_NESTED_PROJECTS" = "0" 9 | "SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" 10 | } 11 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2015.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 14 3 | VisualStudioVersion = 14.0.25123.0 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker_VC2015", "StackWalker_VC2015.vcxproj", "{89B2BD42-B130-4811-9043-71A8EBC40DE5}" 6 | EndProject 7 | Global 8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 9 | Debug_VC2015|Itanium = Debug_VC2015|Itanium 10 | Debug_VC2015|Win32 = Debug_VC2015|Win32 11 | Debug_VC2015|x64 = Debug_VC2015|x64 12 | Debug_VC2015-UNICODE|Itanium = Debug_VC2015-UNICODE|Itanium 13 | Debug_VC2015-UNICODE|Win32 = Debug_VC2015-UNICODE|Win32 14 | Debug_VC2015-UNICODE|x64 = Debug_VC2015-UNICODE|x64 15 | Release_VC2015|Itanium = Release_VC2015|Itanium 16 | Release_VC2015|Win32 = Release_VC2015|Win32 17 | Release_VC2015|x64 = Release_VC2015|x64 18 | Release_VC2015-UNICODE|Itanium = Release_VC2015-UNICODE|Itanium 19 | Release_VC2015-UNICODE|Win32 = Release_VC2015-UNICODE|Win32 20 | Release_VC2015-UNICODE|x64 = Release_VC2015-UNICODE|x64 21 | EndGlobalSection 22 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 23 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015|Itanium.ActiveCfg = Debug_VC2015|Itanium 24 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015|Itanium.Build.0 = Debug_VC2015|Itanium 25 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015|Win32.ActiveCfg = Debug_VC2015|Win32 26 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015|Win32.Build.0 = Debug_VC2015|Win32 27 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015|x64.ActiveCfg = Debug_VC2015|x64 28 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015|x64.Build.0 = Debug_VC2015|x64 29 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015-UNICODE|Itanium.ActiveCfg = Debug_VC2015-UNICODE|Itanium 30 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015-UNICODE|Itanium.Build.0 = Debug_VC2015-UNICODE|Itanium 31 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015-UNICODE|Win32.ActiveCfg = Debug_VC2015-UNICODE|Win32 32 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015-UNICODE|Win32.Build.0 = Debug_VC2015-UNICODE|Win32 33 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015-UNICODE|x64.ActiveCfg = Debug_VC2015-UNICODE|x64 34 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2015-UNICODE|x64.Build.0 = Debug_VC2015-UNICODE|x64 35 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015|Itanium.ActiveCfg = Release_VC2015|Itanium 36 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015|Itanium.Build.0 = Release_VC2015|Itanium 37 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015|Win32.ActiveCfg = Release_VC2015|Win32 38 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015|Win32.Build.0 = Release_VC2015|Win32 39 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015|x64.ActiveCfg = Release_VC2015|x64 40 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015|x64.Build.0 = Release_VC2015|x64 41 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015-UNICODE|Itanium.ActiveCfg = Release_VC2015-UNICODE|Itanium 42 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015-UNICODE|Itanium.Build.0 = Release_VC2015-UNICODE|Itanium 43 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015-UNICODE|Win32.ActiveCfg = Release_VC2015-UNICODE|Win32 44 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015-UNICODE|Win32.Build.0 = Release_VC2015-UNICODE|Win32 45 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015-UNICODE|x64.ActiveCfg = Release_VC2015-UNICODE|x64 46 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2015-UNICODE|x64.Build.0 = Release_VC2015-UNICODE|x64 47 | EndGlobalSection 48 | GlobalSection(SolutionProperties) = preSolution 49 | HideSolutionNode = FALSE 50 | EndGlobalSection 51 | EndGlobal 52 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2015.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | 26 | 27 | Header Files 28 | 29 | 30 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2015.vcxproj.vspscc: -------------------------------------------------------------------------------- 1 | "" 2 | { 3 | "FILE_VERSION" = "9237" 4 | "ENLISTMENT_CHOICE" = "NEVER" 5 | "PROJECT_FILE_RELATIVE_PATH" = "" 6 | "NUMBER_OF_EXCLUDED_FILES" = "0" 7 | "ORIGINAL_PROJECT_FILE_PATH" = "" 8 | "NUMBER_OF_NESTED_PROJECTS" = "0" 9 | "SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" 10 | } 11 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2017.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio 15 3 | VisualStudioVersion = 15.0.27130.2036 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker_VC2017", "StackWalker_VC2017.vcxproj", "{89B2BD42-B130-4811-9043-71A8EBC40DE5}" 6 | EndProject 7 | Global 8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 9 | Debug_VC2017|Win32 = Debug_VC2017|Win32 10 | Debug_VC2017|x64 = Debug_VC2017|x64 11 | Debug_VC2017-UNICODE|Win32 = Debug_VC2017-UNICODE|Win32 12 | Debug_VC2017-UNICODE|x64 = Debug_VC2017-UNICODE|x64 13 | Release_VC2017|Win32 = Release_VC2017|Win32 14 | Release_VC2017|x64 = Release_VC2017|x64 15 | Release_VC2017-UNICODE|Win32 = Release_VC2017-UNICODE|Win32 16 | Release_VC2017-UNICODE|x64 = Release_VC2017-UNICODE|x64 17 | EndGlobalSection 18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 19 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|Win32.ActiveCfg = Debug_VC2017|Win32 20 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|Win32.Build.0 = Debug_VC2017|Win32 21 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|x64.ActiveCfg = Debug_VC2017|x64 22 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|x64.Build.0 = Debug_VC2017|x64 23 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|Win32.ActiveCfg = Debug_VC2017-UNICODE|Win32 24 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|Win32.Build.0 = Debug_VC2017-UNICODE|Win32 25 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|x64.ActiveCfg = Debug_VC2017-UNICODE|x64 26 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|x64.Build.0 = Debug_VC2017-UNICODE|x64 27 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|Win32.ActiveCfg = Release_VC2017|Win32 28 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|Win32.Build.0 = Release_VC2017|Win32 29 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|x64.ActiveCfg = Release_VC2017|x64 30 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|x64.Build.0 = Release_VC2017|x64 31 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|Win32.ActiveCfg = Release_VC2017-UNICODE|Win32 32 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|Win32.Build.0 = Release_VC2017-UNICODE|Win32 33 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|x64.ActiveCfg = Release_VC2017-UNICODE|x64 34 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|x64.Build.0 = Release_VC2017-UNICODE|x64 35 | EndGlobalSection 36 | GlobalSection(SolutionProperties) = preSolution 37 | HideSolutionNode = FALSE 38 | EndGlobalSection 39 | EndGlobal 40 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2017.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug_VC2017-UNICODE 6 | Win32 7 | 8 | 9 | Debug_VC2017-UNICODE 10 | x64 11 | 12 | 13 | Debug_VC2017 14 | Win32 15 | 16 | 17 | Debug_VC2017 18 | x64 19 | 20 | 21 | Release_VC2017-UNICODE 22 | Win32 23 | 24 | 25 | Release_VC2017-UNICODE 26 | x64 27 | 28 | 29 | Release_VC2017 30 | Win32 31 | 32 | 33 | Release_VC2017 34 | x64 35 | 36 | 37 | 38 | {89B2BD42-B130-4811-9043-71A8EBC40DE5} 39 | StackWalker_VC2017 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | Win32Proj 49 | 8.1 50 | 51 | 52 | 53 | Application 54 | Unicode 55 | v141 56 | 57 | 58 | Application 59 | Unicode 60 | v141 61 | 62 | 63 | Application 64 | MultiByte 65 | v141 66 | 67 | 68 | Application 69 | MultiByte 70 | v141 71 | 72 | 73 | Application 74 | Unicode 75 | v141 76 | 77 | 78 | Application 79 | Unicode 80 | v141 81 | 82 | 83 | Application 84 | MultiByte 85 | v141 86 | 87 | 88 | Application 89 | MultiByte 90 | v141 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | <_ProjectFileVersion>10.0.30319.1 122 | $(Configuration)\ 123 | $(Configuration)\ 124 | true 125 | $(Platform)\$(Configuration)\ 126 | $(Platform)\$(Configuration)\ 127 | true 128 | $(Configuration)\ 129 | $(Configuration)\ 130 | false 131 | $(Platform)\$(Configuration)\ 132 | $(Platform)\$(Configuration)\ 133 | false 134 | $(Configuration)\ 135 | $(Configuration)\ 136 | true 137 | $(Platform)\$(Configuration)\ 138 | $(Platform)\$(Configuration)\ 139 | true 140 | $(Configuration)\ 141 | $(Configuration)\ 142 | false 143 | $(Platform)\$(Configuration)\ 144 | $(Platform)\$(Configuration)\ 145 | false 146 | AllRules.ruleset 147 | 148 | 149 | AllRules.ruleset 150 | 151 | 152 | AllRules.ruleset 153 | 154 | 155 | AllRules.ruleset 156 | 157 | 158 | AllRules.ruleset 159 | 160 | 161 | AllRules.ruleset 162 | 163 | 164 | AllRules.ruleset 165 | 166 | 167 | AllRules.ruleset 168 | 169 | 170 | 171 | 172 | 173 | Disabled 174 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 175 | true 176 | EnableFastChecks 177 | MultiThreadedDebug 178 | 179 | 180 | Level3 181 | EditAndContinue 182 | 183 | 184 | true 185 | $(OutDir)StackWalker.pdb 186 | Console 187 | false 188 | 189 | 190 | MachineX86 191 | 192 | 193 | 194 | 195 | X64 196 | 197 | 198 | Disabled 199 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 200 | true 201 | EnableFastChecks 202 | MultiThreadedDebug 203 | 204 | 205 | Level3 206 | ProgramDatabase 207 | 208 | 209 | true 210 | $(OutDir)StackWalker.pdb 211 | Console 212 | false 213 | 214 | 215 | MachineX64 216 | 217 | 218 | 219 | 220 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 221 | MultiThreaded 222 | 223 | 224 | Level3 225 | ProgramDatabase 226 | 227 | 228 | true 229 | Console 230 | true 231 | true 232 | false 233 | 234 | 235 | MachineX86 236 | 237 | 238 | 239 | 240 | X64 241 | 242 | 243 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 244 | MultiThreaded 245 | 246 | 247 | Level3 248 | ProgramDatabase 249 | 250 | 251 | true 252 | Console 253 | true 254 | true 255 | false 256 | 257 | 258 | MachineX64 259 | 260 | 261 | 262 | 263 | Disabled 264 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 265 | true 266 | EnableFastChecks 267 | MultiThreadedDebug 268 | 269 | 270 | Level3 271 | EditAndContinue 272 | 273 | 274 | true 275 | $(OutDir)StackWalker.pdb 276 | Console 277 | false 278 | 279 | 280 | MachineX86 281 | 282 | 283 | 284 | 285 | X64 286 | 287 | 288 | Disabled 289 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 290 | true 291 | EnableFastChecks 292 | MultiThreadedDebug 293 | 294 | 295 | Level3 296 | ProgramDatabase 297 | 298 | 299 | true 300 | $(OutDir)StackWalker.pdb 301 | Console 302 | false 303 | 304 | 305 | MachineX64 306 | 307 | 308 | 309 | 310 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 311 | MultiThreaded 312 | 313 | 314 | Level3 315 | ProgramDatabase 316 | 317 | 318 | true 319 | Console 320 | true 321 | true 322 | false 323 | 324 | 325 | MachineX86 326 | 327 | 328 | 329 | 330 | X64 331 | 332 | 333 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 334 | MultiThreaded 335 | 336 | 337 | Level3 338 | ProgramDatabase 339 | 340 | 341 | true 342 | Console 343 | true 344 | true 345 | false 346 | 347 | 348 | MachineX64 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2017.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | 26 | 27 | Header Files 28 | 29 | 30 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2017.vcxproj.vspscc: -------------------------------------------------------------------------------- 1 | "" 2 | { 3 | "FILE_VERSION" = "9237" 4 | "ENLISTMENT_CHOICE" = "NEVER" 5 | "PROJECT_FILE_RELATIVE_PATH" = "" 6 | "NUMBER_OF_EXCLUDED_FILES" = "0" 7 | "ORIGINAL_PROJECT_FILE_PATH" = "" 8 | "NUMBER_OF_NESTED_PROJECTS" = "0" 9 | "SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" 10 | } 11 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2022.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 12.00 2 | # Visual Studio Version 17 3 | VisualStudioVersion = 17.3.32620.295 4 | MinimumVisualStudioVersion = 10.0.40219.1 5 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker_VC2022", "StackWalker_VC2022.vcxproj", "{89B2BD42-B130-4811-9043-71A8EBC40DE5}" 6 | EndProject 7 | Global 8 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 9 | Debug_VC2017|ARM64 = Debug_VC2017|ARM64 10 | Debug_VC2017|Win32 = Debug_VC2017|Win32 11 | Debug_VC2017|x64 = Debug_VC2017|x64 12 | Debug_VC2017-UNICODE|ARM64 = Debug_VC2017-UNICODE|ARM64 13 | Debug_VC2017-UNICODE|Win32 = Debug_VC2017-UNICODE|Win32 14 | Debug_VC2017-UNICODE|x64 = Debug_VC2017-UNICODE|x64 15 | Release_VC2017|ARM64 = Release_VC2017|ARM64 16 | Release_VC2017|Win32 = Release_VC2017|Win32 17 | Release_VC2017|x64 = Release_VC2017|x64 18 | Release_VC2017-UNICODE|ARM64 = Release_VC2017-UNICODE|ARM64 19 | Release_VC2017-UNICODE|Win32 = Release_VC2017-UNICODE|Win32 20 | Release_VC2017-UNICODE|x64 = Release_VC2017-UNICODE|x64 21 | EndGlobalSection 22 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 23 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|ARM64.ActiveCfg = Debug_VC2017|ARM64 24 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|ARM64.Build.0 = Debug_VC2017|ARM64 25 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|Win32.ActiveCfg = Debug_VC2017|Win32 26 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|Win32.Build.0 = Debug_VC2017|Win32 27 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|x64.ActiveCfg = Debug_VC2017|x64 28 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017|x64.Build.0 = Debug_VC2017|x64 29 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|ARM64.ActiveCfg = Debug_VC2017-UNICODE|ARM64 30 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|ARM64.Build.0 = Debug_VC2017-UNICODE|ARM64 31 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|Win32.ActiveCfg = Debug_VC2017-UNICODE|Win32 32 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|Win32.Build.0 = Debug_VC2017-UNICODE|Win32 33 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|x64.ActiveCfg = Debug_VC2017-UNICODE|x64 34 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC2017-UNICODE|x64.Build.0 = Debug_VC2017-UNICODE|x64 35 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|ARM64.ActiveCfg = Release_VC2017|ARM64 36 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|ARM64.Build.0 = Release_VC2017|ARM64 37 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|Win32.ActiveCfg = Release_VC2017|Win32 38 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|Win32.Build.0 = Release_VC2017|Win32 39 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|x64.ActiveCfg = Release_VC2017|x64 40 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017|x64.Build.0 = Release_VC2017|x64 41 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|ARM64.ActiveCfg = Release_VC2017-UNICODE|ARM64 42 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|ARM64.Build.0 = Release_VC2017-UNICODE|ARM64 43 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|Win32.ActiveCfg = Release_VC2017-UNICODE|Win32 44 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|Win32.Build.0 = Release_VC2017-UNICODE|Win32 45 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|x64.ActiveCfg = Release_VC2017-UNICODE|x64 46 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC2017-UNICODE|x64.Build.0 = Release_VC2017-UNICODE|x64 47 | EndGlobalSection 48 | GlobalSection(SolutionProperties) = preSolution 49 | HideSolutionNode = FALSE 50 | EndGlobalSection 51 | GlobalSection(ExtensibilityGlobals) = postSolution 52 | SolutionGuid = {214F4088-66CE-43FA-80E8-33674E8CE048} 53 | EndGlobalSection 54 | EndGlobal 55 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2022.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug_VC2017-UNICODE 6 | ARM64 7 | 8 | 9 | Debug_VC2017-UNICODE 10 | Win32 11 | 12 | 13 | Debug_VC2017-UNICODE 14 | x64 15 | 16 | 17 | Debug_VC2017 18 | ARM64 19 | 20 | 21 | Debug_VC2017 22 | Win32 23 | 24 | 25 | Debug_VC2017 26 | x64 27 | 28 | 29 | Release_VC2017-UNICODE 30 | ARM64 31 | 32 | 33 | Release_VC2017-UNICODE 34 | Win32 35 | 36 | 37 | Release_VC2017-UNICODE 38 | x64 39 | 40 | 41 | Release_VC2017 42 | ARM64 43 | 44 | 45 | Release_VC2017 46 | Win32 47 | 48 | 49 | Release_VC2017 50 | x64 51 | 52 | 53 | 54 | {89B2BD42-B130-4811-9043-71A8EBC40DE5} 55 | StackWalker_VC2017 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | Win32Proj 65 | 10.0 66 | 67 | 68 | 69 | Application 70 | Unicode 71 | v143 72 | 73 | 74 | Application 75 | Unicode 76 | v143 77 | 78 | 79 | Application 80 | MultiByte 81 | v143 82 | 83 | 84 | Application 85 | MultiByte 86 | v143 87 | 88 | 89 | Application 90 | Unicode 91 | v143 92 | 93 | 94 | Application 95 | Unicode 96 | v143 97 | 98 | 99 | Application 100 | Unicode 101 | v143 102 | 103 | 104 | Application 105 | Unicode 106 | v143 107 | 108 | 109 | Application 110 | MultiByte 111 | v143 112 | 113 | 114 | Application 115 | MultiByte 116 | v143 117 | 118 | 119 | Application 120 | MultiByte 121 | v143 122 | 123 | 124 | Application 125 | MultiByte 126 | v143 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | <_ProjectFileVersion>10.0.30319.1 170 | $(Configuration)\ 171 | $(Configuration)\ 172 | true 173 | $(Platform)\$(Configuration)\ 174 | $(Platform)\$(Configuration)\ 175 | $(Platform)\$(Configuration)\ 176 | $(Platform)\$(Configuration)\ 177 | true 178 | true 179 | $(Configuration)\ 180 | $(Configuration)\ 181 | false 182 | $(Platform)\$(Configuration)\ 183 | $(Platform)\$(Configuration)\ 184 | $(Platform)\$(Configuration)\ 185 | $(Platform)\$(Configuration)\ 186 | false 187 | false 188 | $(Configuration)\ 189 | $(Configuration)\ 190 | true 191 | $(Platform)\$(Configuration)\ 192 | $(Platform)\$(Configuration)\ 193 | $(Platform)\$(Configuration)\ 194 | $(Platform)\$(Configuration)\ 195 | true 196 | true 197 | $(Configuration)\ 198 | $(Configuration)\ 199 | false 200 | $(Platform)\$(Configuration)\ 201 | $(Platform)\$(Configuration)\ 202 | $(Platform)\$(Configuration)\ 203 | $(Platform)\$(Configuration)\ 204 | false 205 | false 206 | AllRules.ruleset 207 | 208 | 209 | AllRules.ruleset 210 | AllRules.ruleset 211 | 212 | 213 | 214 | 215 | AllRules.ruleset 216 | 217 | 218 | AllRules.ruleset 219 | AllRules.ruleset 220 | 221 | 222 | 223 | 224 | AllRules.ruleset 225 | 226 | 227 | AllRules.ruleset 228 | AllRules.ruleset 229 | 230 | 231 | 232 | 233 | AllRules.ruleset 234 | 235 | 236 | AllRules.ruleset 237 | AllRules.ruleset 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | Disabled 246 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 247 | true 248 | EnableFastChecks 249 | MultiThreadedDebug 250 | 251 | 252 | Level3 253 | EditAndContinue 254 | 255 | 256 | true 257 | $(OutDir)StackWalker.pdb 258 | Console 259 | false 260 | 261 | 262 | MachineX86 263 | 264 | 265 | 266 | 267 | X64 268 | 269 | 270 | Disabled 271 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 272 | true 273 | EnableFastChecks 274 | MultiThreadedDebug 275 | 276 | 277 | Level3 278 | ProgramDatabase 279 | 280 | 281 | true 282 | $(OutDir)StackWalker.pdb 283 | Console 284 | false 285 | 286 | 287 | MachineX64 288 | 289 | 290 | 291 | 292 | 293 | Disabled 294 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 295 | true 296 | EnableFastChecks 297 | MultiThreadedDebug 298 | 299 | 300 | Level3 301 | ProgramDatabase 302 | 303 | 304 | true 305 | $(OutDir)StackWalker.pdb 306 | Console 307 | true 308 | 309 | 310 | 311 | 312 | 313 | 314 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 315 | MultiThreaded 316 | 317 | 318 | Level3 319 | ProgramDatabase 320 | 321 | 322 | true 323 | Console 324 | true 325 | true 326 | false 327 | 328 | 329 | MachineX86 330 | 331 | 332 | 333 | 334 | X64 335 | 336 | 337 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 338 | MultiThreaded 339 | 340 | 341 | Level3 342 | ProgramDatabase 343 | 344 | 345 | true 346 | Console 347 | true 348 | true 349 | false 350 | 351 | 352 | MachineX64 353 | 354 | 355 | 356 | 357 | 358 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 359 | MultiThreaded 360 | 361 | 362 | Level3 363 | ProgramDatabase 364 | 365 | 366 | true 367 | Console 368 | true 369 | true 370 | true 371 | 372 | 373 | 374 | 375 | 376 | 377 | Disabled 378 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 379 | true 380 | EnableFastChecks 381 | MultiThreadedDebug 382 | 383 | 384 | Level3 385 | EditAndContinue 386 | 387 | 388 | true 389 | $(OutDir)StackWalker.pdb 390 | Console 391 | false 392 | 393 | 394 | MachineX86 395 | 396 | 397 | 398 | 399 | X64 400 | 401 | 402 | Disabled 403 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 404 | true 405 | EnableFastChecks 406 | MultiThreadedDebug 407 | 408 | 409 | Level3 410 | ProgramDatabase 411 | 412 | 413 | true 414 | $(OutDir)StackWalker.pdb 415 | Console 416 | false 417 | 418 | 419 | MachineX64 420 | 421 | 422 | 423 | 424 | 425 | Disabled 426 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 427 | true 428 | EnableFastChecks 429 | MultiThreadedDebug 430 | 431 | 432 | Level3 433 | ProgramDatabase 434 | 435 | 436 | true 437 | $(OutDir)StackWalker.pdb 438 | Console 439 | true 440 | 441 | 442 | 443 | 444 | 445 | 446 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 447 | MultiThreaded 448 | 449 | 450 | Level3 451 | ProgramDatabase 452 | 453 | 454 | true 455 | Console 456 | true 457 | true 458 | false 459 | 460 | 461 | MachineX86 462 | 463 | 464 | 465 | 466 | X64 467 | 468 | 469 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 470 | MultiThreaded 471 | 472 | 473 | Level3 474 | ProgramDatabase 475 | 476 | 477 | true 478 | Console 479 | true 480 | true 481 | false 482 | 483 | 484 | MachineX64 485 | 486 | 487 | 488 | 489 | 490 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 491 | MultiThreaded 492 | 493 | 494 | Level3 495 | ProgramDatabase 496 | 497 | 498 | true 499 | Console 500 | true 501 | true 502 | true 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2022.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | 26 | 27 | Header Files 28 | 29 | 30 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC2022.vcxproj.vspscc: -------------------------------------------------------------------------------- 1 | "" 2 | { 3 | "FILE_VERSION" = "9237" 4 | "ENLISTMENT_CHOICE" = "NEVER" 5 | "PROJECT_FILE_RELATIVE_PATH" = "" 6 | "NUMBER_OF_EXCLUDED_FILES" = "0" 7 | "ORIGINAL_PROJECT_FILE_PATH" = "" 8 | "NUMBER_OF_NESTED_PROJECTS" = "0" 9 | "SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" 10 | } 11 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC5.dsp: -------------------------------------------------------------------------------- 1 | # Microsoft Developer Studio Project File - Name="StackWalker_VC5" - Package Owner=<4> 2 | # Microsoft Developer Studio Generated Build File, Format Version 5.00 3 | # ** DO NOT EDIT ** 4 | 5 | # TARGTYPE "Win32 (x86) Console Application" 0x0103 6 | 7 | CFG=StackWalker_VC5 - Win32 Debug 8 | !MESSAGE This is not a valid makefile. To build this project using NMAKE, 9 | !MESSAGE use the Export Makefile command and run 10 | !MESSAGE 11 | !MESSAGE NMAKE /f "StackWalker_VC5.mak". 12 | !MESSAGE 13 | !MESSAGE You can specify a configuration when running NMAKE 14 | !MESSAGE by defining the macro CFG on the command line. For example: 15 | !MESSAGE 16 | !MESSAGE NMAKE /f "StackWalker_VC5.mak" CFG="StackWalker_VC5 - Win32 Debug" 17 | !MESSAGE 18 | !MESSAGE Possible choices for configuration are: 19 | !MESSAGE 20 | !MESSAGE "StackWalker_VC5 - Win32 Release" (based on\ 21 | "Win32 (x86) Console Application") 22 | !MESSAGE "StackWalker_VC5 - Win32 Debug" (based on\ 23 | "Win32 (x86) Console Application") 24 | !MESSAGE 25 | 26 | # Begin Project 27 | # PROP Scc_ProjName "" 28 | # PROP Scc_LocalPath "" 29 | CPP=cl.exe 30 | RSC=rc.exe 31 | 32 | !IF "$(CFG)" == "StackWalker_VC5 - Win32 Release" 33 | 34 | # PROP BASE Use_MFC 0 35 | # PROP BASE Use_Debug_Libraries 0 36 | # PROP BASE Output_Dir "Release" 37 | # PROP BASE Intermediate_Dir "Release" 38 | # PROP BASE Target_Dir "" 39 | # PROP Use_MFC 0 40 | # PROP Use_Debug_Libraries 0 41 | # PROP Output_Dir "Release" 42 | # PROP Intermediate_Dir "Release" 43 | # PROP Ignore_Export_Lib 0 44 | # PROP Target_Dir "" 45 | # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 46 | # ADD CPP /nologo /W3 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 47 | # ADD BASE RSC /l 0x407 /d "NDEBUG" 48 | # ADD RSC /l 0x407 /d "NDEBUG" 49 | BSC32=bscmake.exe 50 | # ADD BASE BSC32 /nologo 51 | # ADD BSC32 /nologo 52 | LINK32=link.exe 53 | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 54 | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 55 | 56 | !ELSEIF "$(CFG)" == "StackWalker_VC5 - Win32 Debug" 57 | 58 | # PROP BASE Use_MFC 0 59 | # PROP BASE Use_Debug_Libraries 1 60 | # PROP BASE Output_Dir "Debug" 61 | # PROP BASE Intermediate_Dir "Debug" 62 | # PROP BASE Target_Dir "" 63 | # PROP Use_MFC 0 64 | # PROP Use_Debug_Libraries 1 65 | # PROP Output_Dir "Debug" 66 | # PROP Intermediate_Dir "Debug" 67 | # PROP Target_Dir "" 68 | # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 69 | # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c 70 | # ADD BASE RSC /l 0x407 /d "_DEBUG" 71 | # ADD RSC /l 0x407 /d "_DEBUG" 72 | BSC32=bscmake.exe 73 | # ADD BASE BSC32 /nologo 74 | # ADD BSC32 /nologo 75 | LINK32=link.exe 76 | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept 77 | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept 78 | 79 | !ENDIF 80 | 81 | # Begin Target 82 | 83 | # Name "StackWalker_VC5 - Win32 Release" 84 | # Name "StackWalker_VC5 - Win32 Debug" 85 | # Begin Source File 86 | 87 | SOURCE=.\main.cpp 88 | # End Source File 89 | # Begin Source File 90 | 91 | SOURCE=.\StackWalker.cpp 92 | # End Source File 93 | # Begin Source File 94 | 95 | SOURCE=.\StackWalker.h 96 | # End Source File 97 | # End Target 98 | # End Project 99 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC5.dsw: -------------------------------------------------------------------------------- 1 | Microsoft Developer Studio Workspace File, Format Version 5.00 2 | # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! 3 | 4 | ############################################################################### 5 | 6 | Project: "StackWalker_VC5"=".\StackWalker_VC5.dsp" - Package Owner=<4> 7 | 8 | Package=<5> 9 | {{{ 10 | }}} 11 | 12 | Package=<4> 13 | {{{ 14 | }}} 15 | 16 | ############################################################################### 17 | 18 | Global: 19 | 20 | Package=<5> 21 | {{{ 22 | }}} 23 | 24 | Package=<3> 25 | {{{ 26 | }}} 27 | 28 | ############################################################################### 29 | 30 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC6.dsp: -------------------------------------------------------------------------------- 1 | # Microsoft Developer Studio Project File - Name="StackWalker_VC6" - Package Owner=<4> 2 | # Microsoft Developer Studio Generated Build File, Format Version 6.00 3 | # ** DO NOT EDIT ** 4 | 5 | # TARGTYPE "Win32 (x86) Console Application" 0x0103 6 | 7 | CFG=StackWalker_VC6 - Win32 Debug 8 | !MESSAGE This is not a valid makefile. To build this project using NMAKE, 9 | !MESSAGE use the Export Makefile command and run 10 | !MESSAGE 11 | !MESSAGE NMAKE /f "StackWalker_VC6.mak". 12 | !MESSAGE 13 | !MESSAGE You can specify a configuration when running NMAKE 14 | !MESSAGE by defining the macro CFG on the command line. For example: 15 | !MESSAGE 16 | !MESSAGE NMAKE /f "StackWalker_VC6.mak" CFG="StackWalker_VC6 - Win32 Debug" 17 | !MESSAGE 18 | !MESSAGE Possible choices for configuration are: 19 | !MESSAGE 20 | !MESSAGE "StackWalker_VC6 - Win32 Release" (based on "Win32 (x86) Console Application") 21 | !MESSAGE "StackWalker_VC6 - Win32 Debug" (based on "Win32 (x86) Console Application") 22 | !MESSAGE 23 | 24 | # Begin Project 25 | # PROP AllowPerConfigDependencies 0 26 | # PROP Scc_ProjName "" 27 | # PROP Scc_LocalPath "" 28 | CPP=cl.exe 29 | RSC=rc.exe 30 | 31 | !IF "$(CFG)" == "StackWalker_VC6 - Win32 Release" 32 | 33 | # PROP BASE Use_MFC 0 34 | # PROP BASE Use_Debug_Libraries 0 35 | # PROP BASE Output_Dir "Release" 36 | # PROP BASE Intermediate_Dir "Release" 37 | # PROP BASE Target_Dir "" 38 | # PROP Use_MFC 0 39 | # PROP Use_Debug_Libraries 0 40 | # PROP Output_Dir "Release" 41 | # PROP Intermediate_Dir "Release" 42 | # PROP Ignore_Export_Lib 0 43 | # PROP Target_Dir "" 44 | # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 45 | # ADD CPP /nologo /W3 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c 46 | # ADD BASE RSC /l 0x407 /d "NDEBUG" 47 | # ADD RSC /l 0x407 /d "NDEBUG" 48 | BSC32=bscmake.exe 49 | # ADD BASE BSC32 /nologo 50 | # ADD BSC32 /nologo 51 | LINK32=link.exe 52 | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 53 | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 54 | 55 | !ELSEIF "$(CFG)" == "StackWalker_VC6 - Win32 Debug" 56 | 57 | # PROP BASE Use_MFC 0 58 | # PROP BASE Use_Debug_Libraries 1 59 | # PROP BASE Output_Dir "Debug" 60 | # PROP BASE Intermediate_Dir "Debug" 61 | # PROP BASE Target_Dir "" 62 | # PROP Use_MFC 0 63 | # PROP Use_Debug_Libraries 1 64 | # PROP Output_Dir "Debug" 65 | # PROP Intermediate_Dir "Debug" 66 | # PROP Target_Dir "" 67 | # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c 68 | # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c 69 | # ADD BASE RSC /l 0x407 /d "_DEBUG" 70 | # ADD RSC /l 0x407 /d "_DEBUG" 71 | BSC32=bscmake.exe 72 | # ADD BASE BSC32 /nologo 73 | # ADD BSC32 /nologo 74 | LINK32=link.exe 75 | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept 76 | # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept 77 | 78 | !ENDIF 79 | 80 | # Begin Target 81 | 82 | # Name "StackWalker_VC6 - Win32 Release" 83 | # Name "StackWalker_VC6 - Win32 Debug" 84 | # Begin Group "Source Files" 85 | 86 | # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" 87 | # Begin Source File 88 | 89 | SOURCE=.\main.cpp 90 | # End Source File 91 | # Begin Source File 92 | 93 | SOURCE=.\StackWalker.cpp 94 | # End Source File 95 | # End Group 96 | # Begin Group "Header Files" 97 | 98 | # PROP Default_Filter "h;hpp;hxx;hm;inl" 99 | # Begin Source File 100 | 101 | SOURCE=.\StackWalker.h 102 | # End Source File 103 | # End Group 104 | # Begin Group "Resource Files" 105 | 106 | # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" 107 | # End Group 108 | # End Target 109 | # End Project 110 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC6.dsw: -------------------------------------------------------------------------------- 1 | Microsoft Developer Studio Workspace File, Format Version 6.00 2 | # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! 3 | 4 | ############################################################################### 5 | 6 | Project: "StackWalker_VC6"=".\StackWalker_VC6.dsp" - Package Owner=<4> 7 | 8 | Package=<5> 9 | {{{ 10 | }}} 11 | 12 | Package=<4> 13 | {{{ 14 | }}} 15 | 16 | ############################################################################### 17 | 18 | Global: 19 | 20 | Package=<5> 21 | {{{ 22 | }}} 23 | 24 | Package=<3> 25 | {{{ 26 | }}} 27 | 28 | ############################################################################### 29 | 30 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC70.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 7.00 2 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker", "StackWalker_VC70.vcproj", "{9B5607ED-595C-4439-91D9-6A085BE7DBB8}" 3 | EndProject 4 | Global 5 | GlobalSection(SolutionConfiguration) = preSolution 6 | ConfigName.0 = Debug_VC70 7 | ConfigName.1 = Debug_VC70-UNICODE 8 | ConfigName.2 = Release_VC70 9 | ConfigName.3 = Release_VC70-UNICODE 10 | EndGlobalSection 11 | GlobalSection(ProjectDependencies) = postSolution 12 | EndGlobalSection 13 | GlobalSection(ProjectConfiguration) = postSolution 14 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC70.ActiveCfg = Debug_VC70|Win32 15 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC70.Build.0 = Debug_VC70|Win32 16 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC70-UNICODE.ActiveCfg = Debug_VC70-UNICODE|Win32 17 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC70-UNICODE.Build.0 = Debug_VC70-UNICODE|Win32 18 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC70.ActiveCfg = Release_VC70|Win32 19 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC70.Build.0 = Release_VC70|Win32 20 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC70-UNICODE.ActiveCfg = Release_VC70-UNICODE|Win32 21 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC70-UNICODE.Build.0 = Release_VC70-UNICODE|Win32 22 | EndGlobalSection 23 | GlobalSection(ExtensibilityGlobals) = postSolution 24 | EndGlobalSection 25 | GlobalSection(ExtensibilityAddIns) = postSolution 26 | EndGlobalSection 27 | EndGlobal 28 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC70.vcproj: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 11 | 12 | 13 | 19 | 30 | 32 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 61 | 67 | 75 | 77 | 86 | 88 | 90 | 92 | 94 | 96 | 98 | 100 | 102 | 104 | 106 | 107 | 113 | 124 | 126 | 134 | 136 | 138 | 140 | 142 | 144 | 146 | 148 | 150 | 152 | 154 | 155 | 161 | 169 | 171 | 180 | 182 | 184 | 186 | 188 | 190 | 192 | 194 | 196 | 198 | 200 | 201 | 202 | 203 | 204 | 205 | 209 | 211 | 212 | 214 | 215 | 216 | 220 | 222 | 223 | 224 | 228 | 229 | 230 | 231 | 232 | 233 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC71.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 8.00 2 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker_VC71", "StackWalker_VC71.vcproj", "{9B5607ED-595C-4439-91D9-6A085BE7DBB8}" 3 | ProjectSection(ProjectDependencies) = postProject 4 | EndProjectSection 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfiguration) = preSolution 8 | Debug_VC71 = Debug_VC71 9 | Debug_VC71-UNICODE = Debug_VC71-UNICODE 10 | Release_VC71 = Release_VC71 11 | Release_VC71-UNICODE = Release_VC71-UNICODE 12 | EndGlobalSection 13 | GlobalSection(ProjectConfiguration) = postSolution 14 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC71.ActiveCfg = Debug_VC71|Win32 15 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC71.Build.0 = Debug_VC71|Win32 16 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC71-UNICODE.ActiveCfg = Debug_VC71-UNICODE|Win32 17 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug_VC71-UNICODE.Build.0 = Debug_VC71-UNICODE|Win32 18 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC71.ActiveCfg = Release_VC71|Win32 19 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC71.Build.0 = Release_VC71|Win32 20 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC71-UNICODE.ActiveCfg = Release_VC71-UNICODE|Win32 21 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release_VC71-UNICODE.Build.0 = Release_VC71-UNICODE|Win32 22 | EndGlobalSection 23 | GlobalSection(ExtensibilityGlobals) = postSolution 24 | EndGlobalSection 25 | GlobalSection(ExtensibilityAddIns) = postSolution 26 | EndGlobalSection 27 | EndGlobal 28 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC71.vcproj: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 11 | 12 | 13 | 19 | 30 | 32 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 61 | 67 | 75 | 77 | 86 | 88 | 90 | 92 | 94 | 96 | 98 | 100 | 102 | 104 | 106 | 107 | 113 | 124 | 126 | 134 | 136 | 138 | 140 | 142 | 144 | 146 | 148 | 150 | 152 | 154 | 155 | 161 | 169 | 171 | 180 | 182 | 184 | 186 | 188 | 190 | 192 | 194 | 196 | 198 | 200 | 201 | 202 | 203 | 204 | 205 | 209 | 211 | 212 | 214 | 215 | 216 | 220 | 222 | 223 | 224 | 228 | 229 | 230 | 231 | 232 | 233 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC8.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 9.00 2 | # Visual Studio 2005 3 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker", "StackWalker_VC8.vcproj", "{9B5607ED-595C-4439-91D9-6A085BE7DBB8}" 4 | EndProject 5 | Global 6 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 7 | Debug|Itanium = Debug|Itanium 8 | Debug|Win32 = Debug|Win32 9 | Debug|x64 = Debug|x64 10 | Release|Itanium = Release|Itanium 11 | Release|Win32 = Release|Win32 12 | Release|x64 = Release|x64 13 | EndGlobalSection 14 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 15 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug|Itanium.ActiveCfg = Debug|Itanium 16 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug|Itanium.Build.0 = Debug|Itanium 17 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug|Win32.ActiveCfg = Debug|Win32 18 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug|Win32.Build.0 = Debug|Win32 19 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug|x64.ActiveCfg = Debug|x64 20 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Debug|x64.Build.0 = Debug|x64 21 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release|Itanium.ActiveCfg = Release|Itanium 22 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release|Itanium.Build.0 = Release|Itanium 23 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release|Win32.ActiveCfg = Release|Win32 24 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release|Win32.Build.0 = Release|Win32 25 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release|x64.ActiveCfg = Release|x64 26 | {9B5607ED-595C-4439-91D9-6A085BE7DBB8}.Release|x64.Build.0 = Release|x64 27 | EndGlobalSection 28 | GlobalSection(SolutionProperties) = preSolution 29 | HideSolutionNode = FALSE 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC8.vcproj: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 14 | 17 | 20 | 21 | 22 | 23 | 24 | 31 | 34 | 37 | 40 | 43 | 46 | 58 | 61 | 64 | 67 | 76 | 79 | 82 | 85 | 88 | 91 | 94 | 97 | 100 | 101 | 108 | 111 | 114 | 117 | 120 | 124 | 136 | 139 | 142 | 145 | 154 | 157 | 160 | 163 | 166 | 169 | 172 | 175 | 178 | 179 | 186 | 189 | 192 | 195 | 198 | 202 | 214 | 217 | 220 | 223 | 232 | 235 | 238 | 241 | 244 | 247 | 250 | 253 | 256 | 257 | 264 | 267 | 270 | 273 | 276 | 279 | 288 | 291 | 294 | 297 | 307 | 310 | 313 | 316 | 319 | 322 | 325 | 328 | 331 | 332 | 339 | 342 | 345 | 348 | 351 | 355 | 364 | 367 | 370 | 373 | 383 | 386 | 389 | 392 | 395 | 398 | 401 | 404 | 407 | 408 | 415 | 418 | 421 | 424 | 427 | 431 | 440 | 443 | 446 | 449 | 459 | 462 | 465 | 468 | 471 | 474 | 477 | 480 | 483 | 484 | 485 | 486 | 487 | 488 | 493 | 496 | 497 | 500 | 501 | 502 | 507 | 510 | 511 | 512 | 517 | 518 | 519 | 520 | 521 | 522 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC9.sln: -------------------------------------------------------------------------------- 1 | Microsoft Visual Studio Solution File, Format Version 10.00 2 | # Visual Studio 2008 3 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StackWalker_VC9", "StackWalker_VC9.vcproj", "{89B2BD42-B130-4811-9043-71A8EBC40DE5}" 4 | EndProject 5 | Global 6 | GlobalSection(TeamFoundationVersionControl) = preSolution 7 | SccNumberOfProjects = 2 8 | SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} 9 | SccTeamFoundationServer = https://tfs07.codeplex.com/ 10 | SccLocalPath0 = . 11 | SccProjectUniqueName1 = StackWalker_VC9.vcproj 12 | SccLocalPath1 = . 13 | EndGlobalSection 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug_VC9|Itanium = Debug_VC9|Itanium 16 | Debug_VC9|Win32 = Debug_VC9|Win32 17 | Debug_VC9|x64 = Debug_VC9|x64 18 | Debug_VC9-UNICODE|Itanium = Debug_VC9-UNICODE|Itanium 19 | Debug_VC9-UNICODE|Win32 = Debug_VC9-UNICODE|Win32 20 | Debug_VC9-UNICODE|x64 = Debug_VC9-UNICODE|x64 21 | Release_VC9|Itanium = Release_VC9|Itanium 22 | Release_VC9|Win32 = Release_VC9|Win32 23 | Release_VC9|x64 = Release_VC9|x64 24 | Release_VC9-UNICODE|Itanium = Release_VC9-UNICODE|Itanium 25 | Release_VC9-UNICODE|Win32 = Release_VC9-UNICODE|Win32 26 | Release_VC9-UNICODE|x64 = Release_VC9-UNICODE|x64 27 | EndGlobalSection 28 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 29 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9|Itanium.ActiveCfg = Debug_VC9|Itanium 30 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9|Itanium.Build.0 = Debug_VC9|Itanium 31 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9|Win32.ActiveCfg = Debug_VC9|Win32 32 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9|Win32.Build.0 = Debug_VC9|Win32 33 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9|x64.ActiveCfg = Debug_VC9|x64 34 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9|x64.Build.0 = Debug_VC9|x64 35 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9-UNICODE|Itanium.ActiveCfg = Debug_VC9-UNICODE|Itanium 36 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9-UNICODE|Itanium.Build.0 = Debug_VC9-UNICODE|Itanium 37 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9-UNICODE|Win32.ActiveCfg = Debug_VC9-UNICODE|Win32 38 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9-UNICODE|Win32.Build.0 = Debug_VC9-UNICODE|Win32 39 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9-UNICODE|x64.ActiveCfg = Debug_VC9-UNICODE|x64 40 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Debug_VC9-UNICODE|x64.Build.0 = Debug_VC9-UNICODE|x64 41 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9|Itanium.ActiveCfg = Release_VC9|Itanium 42 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9|Itanium.Build.0 = Release_VC9|Itanium 43 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9|Win32.ActiveCfg = Release_VC9|Win32 44 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9|Win32.Build.0 = Release_VC9|Win32 45 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9|x64.ActiveCfg = Release_VC9|x64 46 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9|x64.Build.0 = Release_VC9|x64 47 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9-UNICODE|Itanium.ActiveCfg = Release_VC9-UNICODE|Itanium 48 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9-UNICODE|Itanium.Build.0 = Release_VC9-UNICODE|Itanium 49 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9-UNICODE|Win32.ActiveCfg = Release_VC9-UNICODE|Win32 50 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9-UNICODE|Win32.Build.0 = Release_VC9-UNICODE|Win32 51 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9-UNICODE|x64.ActiveCfg = Release_VC9-UNICODE|x64 52 | {89B2BD42-B130-4811-9043-71A8EBC40DE5}.Release_VC9-UNICODE|x64.Build.0 = Release_VC9-UNICODE|x64 53 | EndGlobalSection 54 | GlobalSection(SolutionProperties) = preSolution 55 | HideSolutionNode = FALSE 56 | EndGlobalSection 57 | EndGlobal 58 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC9.vcproj: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 19 | 22 | 25 | 26 | 27 | 28 | 29 | 36 | 39 | 42 | 45 | 48 | 51 | 62 | 65 | 68 | 71 | 82 | 85 | 88 | 91 | 94 | 97 | 100 | 103 | 104 | 111 | 114 | 117 | 120 | 123 | 127 | 138 | 141 | 144 | 147 | 158 | 161 | 164 | 167 | 170 | 173 | 176 | 179 | 180 | 187 | 190 | 193 | 196 | 199 | 203 | 214 | 217 | 220 | 223 | 234 | 237 | 240 | 243 | 246 | 249 | 252 | 255 | 256 | 263 | 266 | 269 | 272 | 275 | 278 | 286 | 289 | 292 | 295 | 307 | 310 | 313 | 316 | 319 | 322 | 325 | 328 | 329 | 336 | 339 | 342 | 345 | 348 | 352 | 360 | 363 | 366 | 369 | 381 | 384 | 387 | 390 | 393 | 396 | 399 | 402 | 403 | 410 | 413 | 416 | 419 | 422 | 426 | 434 | 437 | 440 | 443 | 455 | 458 | 461 | 464 | 467 | 470 | 473 | 476 | 477 | 484 | 487 | 490 | 493 | 496 | 499 | 510 | 513 | 516 | 519 | 530 | 533 | 536 | 539 | 542 | 545 | 548 | 551 | 552 | 559 | 562 | 565 | 568 | 571 | 575 | 586 | 589 | 592 | 595 | 606 | 609 | 612 | 615 | 618 | 621 | 624 | 627 | 628 | 635 | 638 | 641 | 644 | 647 | 651 | 662 | 665 | 668 | 671 | 682 | 685 | 688 | 691 | 694 | 697 | 700 | 703 | 704 | 711 | 714 | 717 | 720 | 723 | 726 | 734 | 737 | 740 | 743 | 755 | 758 | 761 | 764 | 767 | 770 | 773 | 776 | 777 | 784 | 787 | 790 | 793 | 796 | 800 | 808 | 811 | 814 | 817 | 829 | 832 | 835 | 838 | 841 | 844 | 847 | 850 | 851 | 858 | 861 | 864 | 867 | 870 | 874 | 882 | 885 | 888 | 891 | 903 | 906 | 909 | 912 | 915 | 918 | 921 | 924 | 925 | 926 | 927 | 928 | 929 | 934 | 937 | 938 | 941 | 942 | 943 | 948 | 951 | 952 | 953 | 958 | 959 | 960 | 961 | 962 | 963 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC9.vcproj.vspscc: -------------------------------------------------------------------------------- 1 | "" 2 | { 3 | "FILE_VERSION" = "9237" 4 | "ENLISTMENT_CHOICE" = "NEVER" 5 | "PROJECT_FILE_RELATIVE_PATH" = "" 6 | "NUMBER_OF_EXCLUDED_FILES" = "0" 7 | "ORIGINAL_PROJECT_FILE_PATH" = "" 8 | "NUMBER_OF_NESTED_PROJECTS" = "0" 9 | "SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" 10 | } 11 | -------------------------------------------------------------------------------- /Main/StackWalker/StackWalker_VC9.vssscc: -------------------------------------------------------------------------------- 1 | "" 2 | { 3 | "FILE_VERSION" = "9237" 4 | "ENLISTMENT_CHOICE" = "NEVER" 5 | "PROJECT_FILE_RELATIVE_PATH" = "" 6 | "NUMBER_OF_EXCLUDED_FILES" = "0" 7 | "ORIGINAL_PROJECT_FILE_PATH" = "" 8 | "NUMBER_OF_NESTED_PROJECTS" = "0" 9 | "SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" 10 | } 11 | -------------------------------------------------------------------------------- /Main/StackWalker/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JochenKalmbach/StackWalker/50a4ec599092c95026b69475b341f11feb6a82b3/Main/StackWalker/main.cpp -------------------------------------------------------------------------------- /Main/StackWalker/makefile: -------------------------------------------------------------------------------- 1 | !include 2 | 3 | PROJ=StackWalker 4 | ALL : $(OUTDIR) $(OUTDIR)\$(PROJ).exe 5 | 6 | $(OUTDIR) : 7 | if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" 8 | 9 | LINK32_OBJS= \ 10 | $(OUTDIR)\StackWalker.obj \ 11 | $(OUTDIR)\main.obj 12 | 13 | 14 | # Generic rule for building ALL CPP files and placing their OBJ's in the OUTDIR 15 | $(OUTDIR)\StackWalker.obj: 16 | $(cc) $(cdebug) $(cflags) $(cvarsmt) /EHsc /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" /Fp$(OUTDIR)\ StackWalker.cpp 17 | 18 | $(OUTDIR)\main.obj: 19 | $(cc) $(cdebug) $(cflags) $(cvarsmt) /EHsc /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" /Fp$(OUTDIR)\ main.cpp 20 | 21 | $(OUTDIR)\$(PROJ).exe: $(LINK32_OBJS) 22 | $(link) $(ldebug) $(conlflags) /PDB:$(OUTDIR)\$(PROJ).pdb -out:$(OUTDIR)\$(PROJ).exe $(LINK32_OBJS) $(conlibs) ole32.lib 23 | 24 | CLEAN : 25 | $(CLEANUP) 26 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # StackWalker - Walking the callstack 2 | 3 | This article describes the (documented) way to walk a callstack for any thread (own, other and remote). It has an abstraction layer, so the calling app does not need to know the internals. 4 | 5 | This project was initially published on Codeproject (http://www.codeproject.com/KB/threads/StackWalker.aspx). 6 | But it is hard to maintain the article and the source on codeproject, 7 | so I was pushed to publish the source code on an "easier to modify" platform. Therefor I have chosen "codeplex" ;( 8 | 9 | But time goes by, and codeplex went away ;) 10 | 11 | So I now migrated to GitHub ;) 12 | 13 | # Latest Build status 14 | 15 | [![build result](https://ci.appveyor.com/api/projects/status/github/JochenKalmbach/stackwalker?branch=master&svg=true)](https://ci.appveyor.com/project/JochenKalmbach/stackwalker) 16 | 17 | # Documentation 18 | 19 | ## Introduction 20 | 21 | In some cases you need to display the callstack of the current thread or you are just interested in the callstack of other threads / processes. Therefore I wrote this project. 22 | 23 | The goal for this project was the following: 24 | 25 | * Simple interface to generate a callstack 26 | * C++ based to allow overwrites of several methods 27 | * Hiding the implementation details (API) from the class interface 28 | * Support of x86, x64 and IA64 architecture 29 | * Default output to debugger-output window (but can be customized) 30 | * Support of user-provided read-memory-function 31 | * Support of the widest range of development-IDEs (VC5-VC8) 32 | * Most portable solution to walk the callstack 33 | 34 | ## Background 35 | 36 | To walk the callstack there is a documented interface: [StackWalk64](http://msdn.microsoft.com/library/en-us/debug/base/stackwalk64.asp) 37 | Starting with Win9x/W2K, this interface is in the *dbghelp.dll* library (on NT, it is in *imagehlp.dll*). 38 | But the function name (`StackWalk64`) has changed starting with W2K (before it was called `StackWalk` (without the `64`))! 39 | This project only supports the newer Xxx64-functions. If you need to use it on older systems, you can download the [redistributable for NT/W9x](http://www.microsoft.com/downloads/release.asp?releaseid=30682). 40 | 41 | The latest *dbghelp.dll* can always be downloaded with the [Debugging Tools for Windows](http://www.microsoft.com/whdc/devtools/debugging/). 42 | This also contains the *symsrv.dll* which enables the use of the public Microsoft symbols-server (can be used to retrieve debugging information for system-files; see below). 43 | 44 | ## Build 45 | 46 | ``` 47 | mkdir build-dir 48 | cd build-dir 49 | 50 | # batch 51 | cmake -G "Visual Studio 15 2017 Win64" --config RelWithDebInfo -DCMAKE_INSTALL_PREFIX=%cd%/root .. 52 | # powershell 53 | cmake -G "Visual Studio 15 2017 Win64" --config RelWithDebInfo -DCMAKE_INSTALL_PREFIX="$($(get-location).Path)/root" .. 54 | 55 | cmake --build . --config RelWithDebInfo 56 | ctest.exe -V -C RelWithDebInfo 57 | cmake --build . --target install --config RelWithDebInfo 58 | ``` 59 | 60 | ## Using the code 61 | 62 | The usage of the class is very simple. For example if you want to display the callstack of the current thread, just instantiate a `StackWalk` object and call the `ShowCallstack` member: 63 | 64 | ```c++ 65 | #include 66 | #include "StackWalker.h" 67 | 68 | void Func5() { StackWalker sw; sw.ShowCallstack(); } 69 | void Func4() { Func5(); } 70 | void Func3() { Func4(); } 71 | void Func2() { Func3(); } 72 | void Func1() { Func2(); } 73 | 74 | int main() 75 | { 76 | Func1(); 77 | return 0; 78 | } 79 | ``` 80 | 81 | This produces the following output in the debugger-output window: 82 | 83 | [...] (output stripped) 84 | d:\privat\Articles\stackwalker\stackwalker.cpp (736): StackWalker::ShowCallstack 85 | d:\privat\Articles\stackwalker\main.cpp (4): Func5 86 | d:\privat\Articles\stackwalker\main.cpp (5): Func4 87 | d:\privat\Articles\stackwalker\main.cpp (6): Func3 88 | d:\privat\Articles\stackwalker\main.cpp (7): Func2 89 | d:\privat\Articles\stackwalker\main.cpp (8): Func1 90 | d:\privat\Articles\stackwalker\main.cpp (13): main 91 | f:\vs70builds\3077\vc\crtbld\crt\src\crt0.c (259): mainCRTStartup 92 | 77E614C7 (kernel32): (filename not available): _BaseProcessStart@4 93 | 94 | You can now double-click on a line and the IDE will automatically jump to the desired file/line. 95 | 96 | ### Providing own output-mechanism 97 | 98 | If you want to direct the output to a file or want to use some other output-mechanism, you simply need to derive from the `StackWalker` class. 99 | You have two options to do this: only overwrite the `OnOutput` method or overwrite each `OnXxx`-function. 100 | The first solution (`OnOutput`) is very easy and uses the default-implementation of the other `OnXxx`-functions (which should be enough for most of the cases). To output also to the console, you need to do the following: 101 | 102 | ```c++ 103 | class MyStackWalker : public StackWalker 104 | { 105 | public: 106 | MyStackWalker() : StackWalker() {} 107 | protected: 108 | virtual void OnOutput(LPCSTR szText) { 109 | printf(szText); StackWalker::OnOutput(szText); 110 | } 111 | }; 112 | ``` 113 | 114 | ### Retrieving detailed callstack info 115 | 116 | If you want detailed info about the callstack (like loaded-modules, addresses, errors, ...) you can overwrite the corresponding methods. The following methods are provided: 117 | 118 | ```c++ 119 | class StackWalker 120 | { 121 | protected: 122 | virtual void OnSymInit(LPCSTR szSearchPath, DWORD symOptions, LPCSTR szUserName); 123 | virtual void OnLoadModule(LPCSTR img, LPCSTR mod, DWORD64 baseAddr, DWORD size, 124 | DWORD result, LPCSTR symType, LPCSTR pdbName, 125 | ULONGLONG fileVersion); 126 | virtual void OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry); 127 | virtual void OnDbgHelpErr(LPCSTR szFuncName, DWORD gle, DWORD64 addr); 128 | }; 129 | ``` 130 | 131 | These methods are called during the generation of the callstack. 132 | 133 | ### Various kinds of callstacks 134 | 135 | In the constructor of the class, you need to specify if you want to generate callstacks for the current process or for another process. The following constructors are available: 136 | 137 | ```c++ 138 | { 139 | public: 140 | StackWalker(int options = OptionsAll, 141 | LPCSTR szSymPath = NULL, 142 | DWORD dwProcessId = GetCurrentProcessId(), 143 | HANDLE hProcess = GetCurrentProcess()); 144 | 145 | // Just for other processes with default-values for options and symPath 146 | StackWalker(DWORD dwProcessId, HANDLE hProcess); 147 | 148 | // For showing stack trace after __except or catch 149 | StackWalker(ExceptType extype, int options = OptionsAll, PEXCEPTION_POINTERS exp = NULL); 150 | }; 151 | ``` 152 | 153 | To do the actual stack-walking you need to call the following functions: 154 | 155 | ```c++ 156 | class StackWalker 157 | { 158 | public: 159 | BOOL ShowCallstack(HANDLE hThread = GetCurrentThread(), CONTEXT *context = NULL, 160 | PReadProcessMemoryRoutine readMemoryFunction = NULL, LPVOID pUserData = NULL); 161 | }; 162 | ``` 163 | 164 | ### Displaying the callstack of an exception 165 | 166 | With this `StackWalker` you can also display the callstack inside an structured exception handler. You only need to write a filter-function which does the stack-walking: 167 | 168 | ```c++ 169 | // The exception filter function: 170 | LONG WINAPI ExpFilter(EXCEPTION_POINTERS* pExp, DWORD dwExpCode) 171 | { 172 | StackWalker sw; 173 | sw.ShowCallstack(GetCurrentThread(), pExp->ContextRecord); 174 | return EXCEPTION_EXECUTE_HANDLER; 175 | } 176 | 177 | // This is how to catch an exception: 178 | __try 179 | { 180 | // do some ugly stuff... 181 | } 182 | __except (ExpFilter(GetExceptionInformation(), GetExceptionCode())) 183 | { 184 | } 185 | ``` 186 | 187 | Display the callstack inside an C++ exception handler (two ways): 188 | ```c++ 189 | // This is how to catch an exception: 190 | try 191 | { 192 | // do some ugly stuff... 193 | } 194 | catch (std::exception & ex) 195 | { 196 | StackWalker sw; 197 | sw.ShowCallstack(GetCurrentThread(), sw.GetCurrentExceptionContext()); 198 | } 199 | catch (...) 200 | { 201 | StackWalker sw(StackWalker::AfterCatch); 202 | sw.ShowCallstack(); 203 | } 204 | ``` 205 | 206 | ## Points of Interest 207 | 208 | ### Context and callstack 209 | 210 | To walk the callstack of a given thread, you need at least two facts: 211 | 212 | #### The context of the thread 213 | 214 | The context is used to retrieve the current *Instruction Pointer* and the values for the *Stack Pointer (SP)* and sometimes the *Frame Pointer (FP)*. 215 | The difference between SP and FP is in short: SP points to the latest address on the stack. FP is used to reference the arguments for a function. See also [Difference Between Stack Pointer and Frame Pointer](http://www.embeddedrelated.com/usenet/embedded/show/31646-1.php). 216 | But only the SP is essential for the processor. The FP is only used by the compiler. You can also disable the usage of FP (see: (/Oy [Frame-Pointer Omission](http://msdn.microsoft.com/library/en-us/vccore/html/_core_.2f.oy.asp)). 217 | 218 | #### The callstack 219 | The callstack is a memory-region which contains all the data/addresses of the callers. This data must be used to retrieve the callstack (as the name says). The most important part is: this data-region **must not change** until the stack-walking is finished! This is also the reason why the thread must be in the *Suspended* state to retrieve a valid callstack. If you want to do a stack-walking for the current thread, then you must not change the callstack memory after the addresses which are declared in the context record. 220 | 221 | ### Initializing the [STACKFRAME64](http://msdn.microsoft.com/library/en-us/debug/base/stackframe64_str.asp]-structure) 222 | 223 | To successfully walk the callstack with [StackWalk64](http://msdn.microsoft.com/library/en-us/debug/base/stackwalk64.asp), you need to initialize the [STACKFRAME64](http://msdn.microsoft.com/library/en-us/debug/base/stackframe64_str.asp)-structure with *meaningful* values. In the documentation of `StackWalk64` there is only a small note about this structure: 224 | 225 | * *The first call to this function will fail if the `AddrPC` and `AddrFrame` members of the `STACKFRAME64` structure passed in the `StackFrame` parameter are not initialized.* 226 | 227 | According to this documentation, most programs only initialize `AddrPC` and `AddrFrame` and this had worked until the newest *dbghelp.dll* (v5.6.3.7). Now, you also need to initialize `AddrStack`. After having some trouble with this (and other problems) I talked to the dbghelp-team and got the following answer (2005-08-02; my own comments are written in *italics*!): 228 | 229 | * `AddrStack` should always be set to the stack pointer value for all platforms. You can certainly publish that `AddrStack` should be set. You're also welcome to say that new releases of dbghelp are now requiring this. 230 | * Given a current dbghelp, your code should: 231 | 1. Always use [StackWalk64](http://msdn.microsoft.com/library/en-us/debug/base/stackwalk64.asp) 232 | 2. Always set `AddrPC` to the current instruction pointer (*`Eip` on x86, `Rip` on x64 and `StIIP` on IA64*) 233 | 3. Always set `AddrStack` to the current stack pointer (*`Esp` on x86, `Rsp` on x64 and `IntSp` on IA64*) 234 | 4. Set `AddrFrame` to the current frame pointer when meaningful. On x86 this is `Ebp`, on x64 you can use `Rbp` (*but is not used by VC2005B2; instead it uses `Rdi`!*) and on IA64 you can use `RsBSP`. [StackWalk64](http://msdn.microsoft.com/library/en-us/debug/base/stackwalk64.asp) will ignore the value when it isn't needed for unwinding. 235 | 5. Set `AddrBStore` to `RsBSP` for IA64. 236 | 237 | ### Walking the callstack of the current thread 238 | 239 | On x86 systems (prior to XP), there is no direct supported function to retrieve the context of the current thread. 240 | The recommended way is to throw an exception and catch it. Now you will have a valid context-record. 241 | The default way of capturing the context of the current thread is by doing some inline-assembler to retrieve `EIP`, `ESP` and `EBP`. 242 | If you want to use the *documented* way, then you need to define `CURRENT_THREAD_VIA_EXCEPTION` for the project. 243 | But you should be aware of the fact, that `GET_CURRENT_CONTEXT` is a macro which internally uses [`__try __except`](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/key_s-z_4.asp). 244 | Your function must be able to contain these statements. 245 | 246 | Starting with XP and on x64 and IA64 systems, there is a documented function to retrieve the context of the current thread: [RtlCaptureContext](http://msdn.microsoft.com/library/en-us/debug/base/rtlcapturecontext.asp). 247 | 248 | To do a stack-walking of the current thread, you simply need to do: 249 | 250 | ```c++ 251 | StackWalker sw; 252 | sw.ShowCallstack(); 253 | ``` 254 | 255 | ### Walking the callstack of other threads in the same process 256 | 257 | To walk the callstack of another thread inside the same process, you need to suspend the target thread (so the callstack will not change during the stack-walking). 258 | But you should be aware that suspending a thread in the same process might lead to dead-locks! (See: [Why you never should call Suspend/TerminateThread (Part I)](http://blog.kalmbachnet.de/?postid=6), [Part II](http://blog.kalmbachnet.de/?postid=16, [Part III](http://blog.kalmbachnet.de/?postid=17)) 259 | 260 | If you have the handle to the thread, you can do the following to retrieve the callstack: 261 | 262 | ```c++ 263 | MyStackWalker sw; 264 | sw.ShowCallstack(hThread); 265 | ``` 266 | 267 | For a complete sample to retrieve the callstack of another thread, you can take a look at the demo-project. 268 | 269 | ### Walking the callstack of other threads in other processes 270 | 271 | The approach is almost the same as for walking the callstack for the current process. 272 | You only need to provide the `ProcessID` and a handle to the process (`hProcess`). Then you also need to suspend the thread to do the stack-walking. A complete sample to retrieve the callstack of another process is in the demo-project. 273 | 274 | ### Reusing the `StackWalk` instance 275 | 276 | It is no problem to reuse the `StackWalk` instance, as long as you want to do the stack-walking for the same process. 277 | If you want to do a lot of stack-walking it is recommended to reuse the instance. 278 | The reason is simple: if you create a new instance, then the symbol-files must be re-loaded for each instance. 279 | And this is really time-consuming. Also it is not allowed to access the `StackWalk` functions from different threads (the *dbghelp.dll* is **not** thread-safe!). Therefore it makes no sense to create more than one instance... 280 | 281 | ### Symbol-Search-Path 282 | 283 | By default, a symbol-search path (`SymBuildPath` and `SymUseSymSrv`) is provided to the *dbghelp.dll*. This path contains the following directories: 284 | 285 | * The optionally provided `szSymPath`. If this parameter is provided, the option SymBuildPath is automatically set. Each path must be separated with a semi-colon ";" 286 | * The current directory 287 | * The directory of the EXE 288 | * The environment variable `_NT_SYMBOL_PATH` 289 | * The environment variable `_NT_ALTERNATE_SYMBOL_PATH` 290 | * The environment variable `SYSTEMROOT` 291 | * The environment variable `SYSTEMROOT` appended with "*\system32*" 292 | * The public Microsoft symbol-server: *RV*%SYSTEMDRIVE%\websymbols*http://msdl.microsoft.com/download/symbols* 293 | 294 | ### Symbol-Server 295 | 296 | If you want to use the public symbols for the OS-files from the [Microsoft-Symbol-Server](http://support.microsoft.com/?kbid=311503), you either need the [Debugging Tools for Windows](http://www.microsoft.com/whdc/devtools/debugging/) (then *symsrv.dll* and the latest *dbghelp.dll* will be found automatically) or you need to redistribute "*dbghelp.dll*" **and** "*smysrv.dll*" from this package! 297 | 298 | ### Loading the modules and symbols 299 | 300 | To successfully walk the callstack of a thread, *dbghelp.dll* requires that the modules are known by the library. Therefore you need to "register" each module of the process via [`SymLoadModule64`](http://msdn.microsoft.com/library/en-us/debug/base/symloadmodule64.asp). To accomplish this you need to enumerate the modules of the given process. 301 | 302 | Starting with Win9x and W2K, it is possible to use the [ToolHelp32-API](http://msdn.microsoft.com/library/en-us/perfmon/base/tool_help_library.asp). You need to make a [snapshot (`CreateToolhelp32Snapshot`)](http://msdn.microsoft.com/library/en-us/perfmon/base/createtoolhelp32snapshot.asp) of the process and then you can enumerate the modules via [Module32First](http://msdn.microsoft.com/library/en-us/perfmon/base/module32first.asp) and [Module32Next](http://msdn.microsoft.com/library/en-us/perfmon/base/module32next.asp). Normally the ToolHelp functions are located in the *kernel32.dll* but on Win9x it is located in a separate DLL: *tlhelp32.dll*. Therefore we need to check the functions in both DLLs. 303 | 304 | If you have NT4, then the `ToolHelp32-API` is not available. But in NT4 you can use the PSAPI. To enumerate all modules you need to call [EnumProcessModules](), but you only get the handles to the modules. To feed [SymLoadModule64](http://msdn.microsoft.com/library/en-us/debug/base/symloadmodule64.asp) you also need to query the `ModuleBaseAddr`, `SizeOfImage` (via [GetModuleInformation](http://msdn.microsoft.com/library/en-us/perfmon/base/getmoduleinformation.asp)), `ModuleBaseName` (via [GetModuleBaseName](http://msdn.microsoft.com/library/en-us/perfmon/base/getmodulebasename.asp)) and `ModuleFileName(Path)` (via [GetModuleFileNameEx](http://msdn.microsoft.com/library/en-us/perfmon/base/getmodulefilenameex.asp)). 305 | 306 | ### *dbghelp.dll 307 | 308 | There are a couple of issues with *dbghelp.dll*. 309 | 310 | * The first is, there are two "teams" at Microsoft which redistribute the dbghelp.dll. One team is the *OS-team*, the other is the *Debugging-Tools-Team* (I don't know the real names...). In general you can say: The *dbghelp.dll* provided with the [Debugging Tools for Windows](http://www.microsoft.com/whdc/devtools/debugging/) is the most recent version. 311 | One problem of this two teams is the different versioning of the *dbghelp.dll*. For example, for XP-SP1 the version is *5.1.2600.1106* dated *2002-08-29*. The version *6.0.0017.0* which was redistributed from the *debug-team* is dated *2002-04-31*. So there is at least a conflict in the date (the newer version is older). And it is even harder to decide which version is "better" (or has more functionality). 312 | * Starting with Me/W2K, the *dbghelp.dll* file in the *system32* directory is protected by the [System File Protection](http://support.microsoft.com/?kbid=222193). So if you want to use a newer *dbghelp.dll* you need to redistribute the version from the *Debugging Tools for Windows* (put it in the same directory as your EXE). 313 | This leads to a problem on W2K if you want to walk the callstack for an app which was built using VC7 or later. The VC7 compiler generates a new PDB-format (called [DIA](http://msdn.microsoft.com/library/en-us/diasdk/html/vsoriDebugInterfaceAccessSDK.asp)). 314 | This PDB-format cannot be read with the *dbghelp.dll* which is installed with the OS. Therefore you will not get very useful callstacks (or at least with no debugging info like filename, line, function name, ...). To overcome this problem, you need to redistribute a newer *dbghelp.dll*. 315 | * The *dbghelp.dll* version *6.5.3.7* has a *bug* or at least a *documentation change* of the [StackWalk64](http://msdn.microsoft.com/library/en-us/debug/base/stackwalk64.asp) function. 316 | In the documentation you can read: 317 | *The first call to this function will fail if the `AddrPC` and `AddrFrame` members of the `STACKFRAME64` structure passed in the `StackFrame` parameter are not initialized.* 318 | 319 | and 320 | 321 | * *[The `ContextRecord`] parameter is required only when the `MachineType` parameter is not `IMAGE_FILE_MACHINE_I386`.* 322 | 323 | *But this is not true anymore.* 324 | Now the callstack on x86-systems cannot be retrieved if you pass `NULL` as *`ContextRecord`*. 325 | From my point of view this is a major documentation change. 326 | Now you either need to initialize the `AddrStack` as well, or provide a valid *`ContextRecord`* which contains the `EIP`, `EBP` and `ESP` registers! 327 | * See also comments in the *Initializing the STACKFRAME64-structure* chapter... 328 | 329 | ### Options 330 | 331 | To do some kind of modification of the behavior, you can optionally specify some options. Here is the list of the available options: 332 | 333 | ```c++ 334 | typedef enum StackWalkOptions 335 | { 336 | // No additional info will be retrieved 337 | // (only the address is available) 338 | RetrieveNone = 0, 339 | 340 | // Try to get the symbol name 341 | RetrieveSymbol = 1, 342 | 343 | // Try to get the line for this symbol 344 | RetrieveLine = 2, 345 | 346 | // Try to retrieve the module info 347 | RetrieveModuleInfo = 4, 348 | 349 | // Also retrieve the version for the DLL/EXE 350 | RetrieveFileVersion = 8, 351 | 352 | // Contains all the above 353 | RetrieveVerbose = 0xF, 354 | 355 | // Generate a "good" symbol-search-path 356 | SymBuildPath = 0x10, 357 | 358 | // Also use the public Microsoft-Symbol-Server 359 | SymUseSymSrv = 0x20, 360 | 361 | // Contains all the above "Sym"-options 362 | SymAll = 0x30, 363 | 364 | // Contains all options (default) 365 | OptionsAll = 0x3F 366 | } StackWalkOptions; 367 | ``` 368 | 369 | ## Known issues 370 | 371 | * NT/Win9x: This project only support the `StackWalk64` function. If you need to use it on NT4/Win9x, you need to [redistribute the *dbghelp.dll* for this platform.](http://www.microsoft.com/downloads/release.asp?releaseid=30682) 372 | * Currently only supports ANSI-names in callbacks (of course, the project can be compiled with UNICODE...). 373 | * To open a remote thread I used `OpenThread` which is not available on NT4/W9x. To have an example of doing this in NT4/Win9x please refer to [Remote Library](http://www.codeproject.com/win32/Remote.asp). 374 | * Walking mixed-mode callstacks (managed/unmanaged) does only return the unmanaged functions. 375 | * Doesn't work when debugging with the `/DEBUG:fastlink` [option](https://blogs.msdn.microsoft.com/vcblog/2014/11/12/speeding-up-the-incremental-developer-build-scenario/) 376 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | version: "{branch}-ci-{build}" 2 | 3 | environment: 4 | matrix: 5 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 6 | BUILDER: "msbuild" 7 | PLATFORM: Win32 8 | CONFIGURATION: "Release_VC9-UNICODE" 9 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 10 | BUILDER: "msbuild" 11 | PLATFORM: x64 12 | CONFIGURATION: "Release_VC9-UNICODE" 13 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 14 | CMAKE_GENERATOR: "Visual Studio 12 2013" 15 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 16 | CMAKE_GENERATOR: "Visual Studio 12 2013 Win64" 17 | TARGET_CONFIG: "--config RelWithDebInfo" 18 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 19 | CMAKE_GENERATOR: "Visual Studio 14 2015" 20 | TARGET_CONFIG: "--config RelWithDebInfo" 21 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 22 | CMAKE_GENERATOR: "Visual Studio 14 2015 Win64" 23 | TARGET_CONFIG: "--config RelWithDebInfo" 24 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 25 | CMAKE_GENERATOR: "Visual Studio 15 2017" 26 | TARGET_CONFIG: "--config RelWithDebInfo" 27 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 28 | CMAKE_GENERATOR: "Visual Studio 15 2017 Win64" 29 | TARGET_CONFIG: "--config RelWithDebInfo" 30 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 31 | CMAKE_GENERATOR: "Visual Studio 17 2022" 32 | TARGET_ARCH: "-A Win32" 33 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 34 | CMAKE_GENERATOR: "Visual Studio 17 2022" 35 | TARGET_ARCH: "-A x64" 36 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 37 | CMAKE_GENERATOR: "Visual Studio 17 2022" 38 | TARGET_ARCH: "-A ARM64" 39 | 40 | 41 | before_build: 42 | - if [%BUILDER%]==[msbuild] echo MSVC2008 43 | - if [%BUILDER%]==[msbuild] set "SLN_NAME=Main\StackWalker\StackWalker_VC9.sln" 44 | - if [%BUILDER%]==[msbuild] set "MS_BLD_TOOLSET=v90" 45 | - if [%BUILDER%]==[msbuild] set "MS_VS_DIR=C:\Program Files (x86)\Microsoft Visual Studio 9.0" 46 | - if [%BUILDER%]==[msbuild] set "MS_BLD_DIR=C:\Windows\Microsoft.NET\Framework\v3.5" 47 | - if [%BUILDER%]==[msbuild] set "AVLOGGER=C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" 48 | - if [%BUILDER%]==[msbuild] set "MS_SDK_DIR=C:\Program Files\Microsoft SDKs\Windows\v7.1" 49 | - if [%BUILDER%]==[msbuild] set "PATH=%MS_SDK_DIR%\bin;%PATH%" 50 | - if [%BUILDER%]==[msbuild] set "PATH=%MS_BLD_DIR%;%PATH%" 51 | - if [%BUILDER%]==[msbuild] set "PATH=%MS_VS_DIR%\Common7\IDE;%PATH%" 52 | - if [%BUILDER%]==[msbuild] if [%PLATFORM%]==[Win32] set "PATH=%MS_VS_DIR%\VC\bin;%PATH%" 53 | - if [%BUILDER%]==[msbuild] if [%PLATFORM%]==[x64] set "PATH=%MS_VS_DIR%\VC\bin\amd64;%PATH%" 54 | - if [%BUILDER%]==[msbuild] if [%PLATFORM%]==[Win32] set "LIB=%MS_SDK_DIR%\lib;%MS_VS_DIR%\VC\lib;" 55 | - if [%BUILDER%]==[msbuild] if [%PLATFORM%]==[x64] set "LIB=%MS_SDK_DIR%\lib\x64;%MS_VS_DIR%\VC\lib\amd64;" 56 | - if [%BUILDER%]==[msbuild] if [%PLATFORM%]==[Win32] set TARGET_CPU=x86 57 | - if [%BUILDER%]==[msbuild] if [%PLATFORM%]==[x64] set TARGET_CPU=amd64 58 | - if [%BUILDER%]==[msbuild] if [%PLATFORM%]==[x64] set VC_PROJECT_ENGINE_NOT_USING_REGISTRY_FOR_INIT=1 59 | - if [%BUILDER%]==[msbuild] set "INCLUDE=%MS_SDK_DIR%\include;%INCLUDE%" 60 | - if [%BUILDER%]==[msbuild] set "INCLUDE=%MS_VS_DIR%\VC\include;%INCLUDE%" 61 | - if [%BUILDER%]==[msbuild] set "MS_BLD_ARGS=/m /verbosity:m" 62 | - if [%BUILDER%]==[msbuild] set "MS_BLD_ARGS=%MS_BLD_ARGS% /p:PlatformToolset=%MS_BLD_TOOLSET%" 63 | - if [%BUILDER%]==[msbuild] set "MS_BLD_ARGS=%MS_BLD_ARGS% /t:Clean,Build" 64 | - if [%BUILDER%]==[msbuild] set "MS_BLD_ARGS=%MS_BLD_ARGS% /p:Platform=%PLATFORM%" 65 | - if [%BUILDER%]==[msbuild] set "MS_BLD_ARGS=%MS_BLD_ARGS% /p:Configuration=%CONFIGURATION%" 66 | - if [%BUILDER%]==[msbuild] set "MS_BLD_ARGS=%MS_BLD_ARGS% /p:VCBuildUseEnvironment=true" 67 | 68 | build_script: 69 | - if [%BUILDER%]==[msbuild] cl.exe 70 | - if [%BUILDER%]==[msbuild] msbuild %SLN_NAME% %MS_BLD_ARGS% /logger:"%AVLOGGER%" 71 | - if not [%BUILDER%]==[msbuild] cmake --version 72 | - if not [%BUILDER%]==[msbuild] cmake -E make_directory "build-dir" 73 | - if not [%BUILDER%]==[msbuild] cmake -E chdir "build-dir" cmake -G "%CMAKE_GENERATOR%" %TARGET_ARCH% %TARGET_CONFIG% -DCMAKE_INSTALL_PREFIX="%APPVEYOR_BUILD_FOLDER%/root" .. 74 | - if not [%BUILDER%]==[msbuild] cmake --build "build-dir" --config RelWithDebInfo 75 | - if not [%BUILDER%]==[msbuild] cmake --build "build-dir" --target install --config RelWithDebInfo 76 | 77 | 78 | --------------------------------------------------------------------------------