Получение адреса RVA без PDBC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Получение адреса RVA без PDB

Сообщение Anonymous »

Я создаю проект 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.


Подробнее здесь: https://stackoverflow.com/questions/796 ... ithout-pdb
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»