Как отобразить vtable по имени с помощью gdb

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

Что я хотел бы сделать в gdb, так это иметь возможность запрашивать vtable, выполнив что-то вроде

info address 'vtable for Bar'

Однако единственный найденный мной способ сделать это (без действительного экземпляра объекта) — использовать искаженное имя для vtable.

Пример:

info address _ZTV3Bar

Это не конец света, чтобы попытаться выяснить искаженное имя vtable, но это раздражает (например, использование objdump -t myexecutable).

Кто-нибудь знает способ, где я могу найти адрес vtable типа менее болезненным способом (не требуя действительного экземпляра типа)?
- Правила: не может требовать действительный экземпляр рассматриваемого объекта и найти указатель vtable в объекте.


person Gabe    schedule 21.08.2013    source источник
comment
Это может быть глупый вопрос, но вы пробовали распечатать содержимое Bar? Например: print *barObject?   -  person Amadeus    schedule 21.08.2013
comment
Это против правил. У меня нет экземпляра объекта, но я просто хочу найти виртуальную таблицу для этого типа.   -  person Gabe    schedule 21.08.2013
comment
Похоже на ошибку gdb. info addr может завершить vtable для ..., но тогда он не вычисляет результат должным образом. Не могли бы вы зарегистрировать это в bugzilla?   -  person Tom Tromey    schedule 22.08.2013
comment
info address vtable for Bar у меня работает   -  person ctn    schedule 22.02.2016


Ответы (3)


Вместо этого используйте информационную переменную:

информационная переменная vtable для бара

person HexMachina    schedule 01.05.2014

Отображает информацию о виртуальной таблице методов (vtable) объекта

Синтаксис

info vtbl [Expression]

Параметры

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

person gkso    schedule 29.12.2016

Это против правил.

Какие это правила?

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

Но ты делаешь:

set print object on
print *(Bar*) 0x123456

Это попытается напечатать объект по адресу 0x123456, как если бы он был Bar или производным от Bar. Если на самом деле объект в этом месте является производным от Bar, GDB выведет производный тип и напечатает его члены.

person Employed Russian    schedule 21.08.2013
comment
А вот члены и вптр будут неверны. Если вы просто произвольно выберете место в памяти и отобразите его как панель, он покажет этот объект как панель, но vptr будет неправильным и НЕ будет указывать на vtable для панели. Было бы неплохо иметь возможность визуально проверить расположение памяти 0x123456 и посмотреть, действительно ли vptr указывает на vtable для Bar. Но чтобы узнать этот адрес, мне нужно как-то его найти, что и является исходным вопросом. - person Gabe; 21.08.2013
comment
Я согласен, что вы, вероятно, можете легко сделать это для одного места в памяти, но если вы просматриваете кучу памяти, было бы полезно иметь возможность визуально проверять память на наличие указателей vtable, а не пытаться отбрасывать все по одному. . - person Gabe; 21.08.2013