Я создаю проект C ++ с использованием MSVC, с /Debug < /code> для включения генерации PDB. < /p>
То, что я хочу сделать, способен восстановить полный вызов, не предоставляя 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]));
}
edit :
Действительно, я не могу использовать Std :: Stack_trace , потому что я использую C ++ 14.
Я создаю проект C ++ с использованием MSVC, с /Debug < /code> для включения генерации PDB. < /p> То, что я хочу сделать, способен восстановить полный вызов, не предоставляя PDB в производственной среде. class = "lang-cpp prettyprint-override">[code]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])); } [/code] [b] edit [/b]: Действительно, я не могу использовать Std :: Stack_trace , потому что я использую C ++ 14.