Определить конкретный тип объекта за auto_ptr из дампа ядра

У меня есть auto_ptr<IFoo>, где IFoo - это интерфейс с чисто виртуальными методами.

Теперь у меня также есть файл ядра после ошибки сегментации, где я действительно хотел бы знать, какой конкретный подкласс стоял за этим auto_ptr. Поскольку dynamic_cast работает в проекте, я думаю, что RTTI каким-то образом должен быть доступен, но я не знаю, как мне получить доступ к этой информации через gdb?

Я получаю следующий результат:

(gdb) print this->obj._M_ptr
$22 = (class martin::IFoo *) 0x7418

Что я действительно хотел бы знать, принадлежит ли указатель IBarили IBaz.

Спасибо за любую помощь!


person Martin C.    schedule 17.10.2012    source источник
comment
print typeid(*this->obj._M_ptr) работает?   -  person R. Martinho Fernandes    schedule 17.10.2012
comment
попробуйте этот вопрос / ответ: stackoverflow.com/ questions / 9568201 /   -  person PiotrNycz    schedule 17.10.2012
comment
typeid (...) просто выводит «Нет символа typeid в текущем контексте.», что может означать, что мой кросс-скомпилированный GDB может быть слишком старым. В этом случае это было бы неудачей. Но спасибо за подсказку.   -  person Martin C.    schedule 17.10.2012


Ответы (1)


Что я действительно хотел бы знать, принадлежит ли указатель к IBaror или IBaz

GDB должен вам это сказать. Используйте 1_. Документация здесь.

При отображении указателя на объект идентифицируйте фактический (производный) тип объекта, а не объявленный тип, используя таблицу виртуальных функций. Обратите внимание, что требуется таблица виртуальных функций - эта функция может работать только для объектов, которые имеют идентификацию типа во время выполнения; достаточно одного виртуального метода в объявленном типе объекта.

Обновлять:

он выводит только интерфейс IFoo *

Вероятно, это означает, что указатель действительно указывает на IFoo (например, объект типа IBar или IBaz уже был уничтожен).

Будет ли работа с dynamic_cast подразумевать

Да, dynamic_cast не может работать без RTTI; если вы используете dynamic_cast, print object on должно работать.

person Employed Russian    schedule 17.10.2012
comment
Использование set print object on было моим первым подходом, но он выводит только интерфейс IFoo *. Я начинаю опасаться отсутствия RTTI. Это дамп ядра из удаленного двоичного файла ARM, в котором у меня также есть файлы dbg. Подразумевает ли работа с dynamic_cast необходимость включения RTTI или нет? - person Martin C.; 17.10.2012
comment
@MartinC. Re: динамическое приведение без RTTI: stackoverflow.com/questions / 7687041 / - person shroudednight; 18.10.2012
comment
@shroudednight Спасибо, хороший намек. Я точно знаю, что в процессе компиляции нет явных флагов отключения, но я продолжу исследования в этом направлении. - person Martin C.; 19.10.2012