MCPcopy Create free account
hub / github.com/crownengine/crown / callstack

Function callstack

src/core/debug/callstack_windows.cpp:34–117  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

32 }
33
34 void callstack(log_internal::System system, LogSeverity::Enum severity)
35 {
36 SymInitialize(GetCurrentProcess(), NULL, TRUE);
37 SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_UNDNAME);
38 DWORD mtype;
39 CONTEXT ctx;
40 ZeroMemory(&ctx, sizeof(CONTEXT));
41 ctx.ContextFlags = CONTEXT_CONTROL;
42 RtlCaptureContext(&ctx);
43
44 STACKFRAME64 stack;
45 ZeroMemory(&stack, sizeof(STACKFRAME64));
46#if defined(_M_IX86)
47 mtype = IMAGE_FILE_MACHINE_I386;
48 stack.AddrPC.Offset = ctx.Eip;
49 stack.AddrPC.Mode = AddrModeFlat;
50 stack.AddrFrame.Offset = ctx.Ebp;
51 stack.AddrFrame.Mode = AddrModeFlat;
52 stack.AddrStack.Offset = ctx.Esp;
53 stack.AddrStack.Mode = AddrModeFlat;
54#elif defined(_M_X64)
55 mtype = IMAGE_FILE_MACHINE_AMD64;
56 stack.AddrPC.Offset = ctx.Rip;
57 stack.AddrPC.Mode = AddrModeFlat;
58 stack.AddrFrame.Offset = ctx.Rsp;
59 stack.AddrFrame.Mode = AddrModeFlat;
60 stack.AddrStack.Offset = ctx.Rsp;
61 stack.AddrStack.Mode = AddrModeFlat;
62#endif // if defined(_M_IX86)
63
64 DWORD ldsp = 0;
65 IMAGEHLP_LINE64 line;
66 ZeroMemory(&line, sizeof(IMAGEHLP_LINE64));
67 line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
68
69 char buf[sizeof(SYMBOL_INFO) + (MAX_SYM_NAME - 1) * sizeof(TCHAR)];
70 SYMBOL_INFO *sym = new (buf) SYMBOL_INFO();
71 sym->SizeOfStruct = sizeof(SYMBOL_INFO);
72 sym->MaxNameLen = MAX_SYM_NAME;
73
74 UINT num = 0;
75 while (StackWalk64(mtype
76 , GetCurrentProcess()
77 , GetCurrentThread()
78 , &stack
79 , &ctx
80 , NULL
81 , SymFunctionTableAccess64
82 , SymGetModuleBase64
83 , NULL
84 )) {
85 if (stack.AddrPC.Offset == 0)
86 break;
87
88 ++num;
89
90 BOOL res = SymGetLineFromAddr64(GetCurrentProcess()
91 , stack.AddrPC.Offset

Callers

nothing calls this directly

Calls 1

logxFunction · 0.85

Tested by

no test coverage detected