MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / printCallstack

Function printCallstack

cli/sehwrapper.cpp:74–149  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

72
73
74 void printCallstack(FILE* outputFile, PEXCEPTION_POINTERS ex)
75 {
76 if (!loadDbgHelp())
77 return;
78 const HANDLE hProcess = GetCurrentProcess();
79 const HANDLE hThread = GetCurrentThread();
80 pSymInitialize(
81 hProcess,
82 nullptr,
83 TRUE
84 );
85 CONTEXT context = *(ex->ContextRecord);
86 STACKFRAME64 stack= {0};
87 stack.AddrPC.Mode = AddrModeFlat;
88 stack.AddrStack.Mode = AddrModeFlat;
89 stack.AddrFrame.Mode = AddrModeFlat;
90#if defined(_M_IX86)
91 stack.AddrPC.Offset = context.Eip;
92 stack.AddrStack.Offset = context.Esp;
93 stack.AddrFrame.Offset = context.Ebp;
94#elif defined(_M_AMD64)
95 stack.AddrPC.Offset = context.Rip;
96 stack.AddrStack.Offset = context.Rsp;
97 stack.AddrFrame.Offset = context.Rsp;
98#elif defined(_M_ARM64)
99 stack.AddrPC.Offset = context.Pc;
100 stack.AddrStack.Offset = context.Sp;
101 stack.AddrFrame.Offset = context.Fp;
102#else
103#error Platform not supported!
104#endif
105 IMAGEHLP_SYMBOL64_EXT symbol;
106 symbol.SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
107 symbol.MaxNameLength = maxnamelength;
108 DWORD64 displacement = 0;
109 int beyond_main=-1; // emergency exit, see below
110 for (ULONG frame = 0; ; frame++) {
111 BOOL result = pStackWalk64
112 (
113#if defined(_M_IX86)
114 IMAGE_FILE_MACHINE_I386,
115#elif defined(_M_AMD64)
116 IMAGE_FILE_MACHINE_AMD64,
117#elif defined(_M_ARM64)
118 IMAGE_FILE_MACHINE_ARM64,
119#endif
120 hProcess,
121 hThread,
122 &stack,
123 &context,
124 nullptr,
125 pSymFunctionTableAccess64,
126 pSymGetModuleBase64,
127 nullptr
128 );
129 if (!result) // official end...
130 break;
131 pSymGetSymFromAddr64(hProcess, (ULONG64)stack.AddrPC.Offset, &displacement, &symbol);

Callers 1

filterExceptionFunction · 0.85

Calls 2

loadDbgHelpFunction · 0.85
getArrayLengthFunction · 0.85

Tested by

no test coverage detected