MCPcopy Create free account
hub / github.com/NoMercy-ac/NoMercy / get_stack_frames_text

Method get_stack_frames_text

Source/Client/NM_Engine/StackTrace.cpp:71–116  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

69}
70
71std::vector <std::string> CStackTrace::get_stack_frames_text(void **frames, int num_frames)
72{
73 static std::recursive_mutex mutex;
74 std::unique_lock<std::recursive_mutex> mutex_lock(mutex);
75
76 auto vBacktraceText = std::vector<std::string>();
77
78 auto result = LI_FIND(SymInitialize)(NtCurrentProcess, NULL, TRUE);
79 if (!result)
80 return vBacktraceText;
81
82 for (auto i = 0; i < num_frames; i++)
83 {
84 unsigned char buffer[sizeof(IMAGEHLP_SYMBOL64) + 128];
85 auto symbol64 = reinterpret_cast<IMAGEHLP_SYMBOL64*>(buffer);
86 memset(symbol64, 0, sizeof(IMAGEHLP_SYMBOL64) + 128);
87 symbol64->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
88 symbol64->MaxNameLength = 128;
89
90 DWORD64 displacement = 0;
91 auto result = LI_FIND(SymGetSymFromAddr64)(NtCurrentProcess, (DWORD64)frames[i], &displacement, symbol64);
92 if (result)
93 {
94 IMAGEHLP_LINE64 line64;
95 memset(&line64, 0, sizeof(IMAGEHLP_LINE64));
96 line64.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
97
98 auto dwDisplacement = 0UL;
99 result = LI_FIND(SymGetLineFromAddr64)(NtCurrentProcess, (DWORD64)frames[i], &dwDisplacement, &line64);
100 if (result)
101 {
102 vBacktraceText.push_back
103 (
104 CreateFormatString(xorstr("%s (%s, line %u)").crypt_get(), symbol64->Name, line64.FileName, (int)line64.LineNumber)
105 );
106 }
107 else
108 {
109 vBacktraceText.push_back(symbol64->Name);
110 }
111 }
112 }
113
114 LI_FIND(SymCleanup)(NtCurrentProcess);
115 return vBacktraceText;
116}
117
118std::vector<std::string> CStackTrace::get_stack_trace()
119{

Callers

nothing calls this directly

Calls 1

CreateFormatStringFunction · 0.85

Tested by

no test coverage detected