Как определить тип объекта C ++ по адресу во время выполнения?

Я хотел бы определить тип объекта по адресу памяти, чтобы я мог применить правильное приведение в окне VS Watch и просмотреть объект.

Я пытаюсь выполнить отладку в режиме дизассемблирования, поскольку мой собственный код загружается как DLL в существующий исполняемый файл, для которого у меня нет исходного кода или pdb.

Существование typeid и dynamic_cast дает мне надежду, что есть какой-то способ достичь этого (возможно, ограниченным образом) без какого-либо дополнительного кодирования.

Однако я счастлив, если решение включает в себя изменение моего кода, у меня есть доступ ко всем определениям классов, хотя я не могу обязательно изменить макет в памяти некоторых из них.

У меня также есть переопределение для выделения объектов, поэтому у меня есть возможность выделить здесь дополнительную память для моих собственных целей, например 4 байта перед объектом, в который я мог бы поместить какой-нибудь тег имени.


person billw    schedule 07.09.2019    source источник
comment
Чем typeid недостаточно хорош для вас?   -  person Jester    schedule 07.09.2019
comment
@Jester Это не сработает в окне просмотра   -  person billw    schedule 07.09.2019
comment
Вот ошибка при попытке использовать typeid в окне просмотра или в моем файле .natvis: Ошибка: va_start может появляться только в функции с параметром многоточия ZERO Hit from Google для этого.   -  person billw    schedule 07.09.2019


Ответы (1)


Отвечая на свой вопрос. Я решил эту проблему с помощью системы, предназначенной для отслеживания распределения: http://www.almostinfinite.com/memtrack.html Это капля на замену новому, который помечает все выделения с идентификатором выделяемого типа (вместе с другой информацией).

person billw    schedule 14.09.2019