То, что я хочу сделать, способен восстановить полный вызов, не предоставляя PDB в производственной среде. class = "lang-cpp prettyprint-override">
Код: Выделить всё
void print_callstack()
{
void* stack[100];
USHORT frames = CaptureStackBackTrace(0, 100, stack, NULL);
for (USHORT i = 0; i < frames; ++i)
printf("%02d: %p\n", i, stack[i]);
}
< /code>
Чтобы иметь возможность восстановить имена функций с помощью этого вызовов, мне нужно получить RVA, по печатным адресам, без PDB. < /p>
Это что -то способное? PDB: < /p>
DWORD64 get_rva(void* address)
{
HANDLE process = GetCurrentProcess();
SymInitialize(process, NULL, TRUE);
HMODULE modules[1024];
DWORD cbNeeded;
if (!EnumProcessModules(process, modules, sizeof(modules), &cbNeeded))
return nullptr;
DWORD count = cbNeeded / sizeof(HMODULE);
for (DWORD i = 0; i < count; ++i) {
MODULEINFO modInfo;
if (GetModuleInformation(process, modules[i], &modInfo, sizeof(modInfo))) {
BYTE* base = reinterpret_cast(modInfo.lpBaseOfDll);
if (address >= base && address < base + modInfo.SizeOfImage)
return modules[i] - address;
}
}
return nullptr;
}
void print_callstack()
{
void* stack[100];
USHORT frames = CaptureStackBackTrace(0, 100, stack, NULL);
for (USHORT i = 0; i < frames; ++i)
printf("%02d: addr= %p, rva= %p\n", i, stack[i], get_rva(stack[i]));
}
Действительно, я не могу использовать Std :: Stack_trace , потому что я использую C ++ 14.
Подробнее здесь: https://stackoverflow.com/questions/796 ... ithout-pdb