Vtable Dumper - инструмент для просмотра виртуальных таблиц библиотеки

Материал из Rosalab Wiki
Перейти к: навигация, поиск

Поддержка обратной совместимости внешних API интерфейсов является одной из наиболее важных задач при разработке библиотек. Это позволяет проще портировать существующие приложения на новые версии библиотек. Конечно это относится в первую очередь к библиотекам у которых уже есть применения, но и немаловажно для новых библиотек, поскольку при выборе библиотеки часто обращают внимание не только на функциональность, но и на стабильность. Совместимость бывает трех видов: на уровне исходных кодов, бинарная и функциональная. Наличие совместимости на уровне исходных кодов и функциональной совместимости позволяет портировать приложения путем их пересборки без необходимости модификации кода. Бинарная же совместимость является наиболее сильным уровнем совместимости и позволяет запускать старые приложения без их пересборки.

Наиболее сложно поддерживать совместимость C++ библиотек, так как, по сравнению с Си-библиотеками, дополнительно используются манглинг имен функций и виртуальные таблицы, создаваемые компилятором для реализации полиморфизма классов. Виртуальные таблицы могут меняться нелинейным образом при изменении в объявлении классов (добавление или удаление функций, базовых классов, атрибутов наследования и т.д.) и любое такое изменение может привести к неопределенному поведению или падению приложений. Для контроля за составом виртуальных таблиц мы создали специальный инструмент Vtable Dumper, который печатает содержимое всех виртуальных таблиц найденных в бинарных файлах библиотеки. Таким образом можно сравнить вывод инструмента для старой и новой версии библиотеки, найти и предотвратить случайные изменения.

Пример использования инструмента:

vtable-dumper /usr/lib64/libstdc++.so.6

Стоит заметить, что существует альтернативный способ изучения состава виртуальных таблиц с помощью опции -fdump-class-hierarchy компилятора GNU G++. Однако входными данными для его работы являются заголовочные файлы библиотеки и необходима их компиляция, которая может произойти с ошибками и потребовать дополнительных опций, порядка включения файлов и др. Кроме того, заголовочные файлы в отличие от бинарных файлов библиотеки не всегда установлены в системе. Форматы вывода обоих инструментов практически идентичны. Дополнительно инструмент Vtable-Dumper показывает параметры виртуальных функций в таблице и их mangled-имена (опция -mangled).

Далее приведен пример отображения инструментом содержимого виртуальной таблицы одного из классов библиотеки libQtGui:

 Vtable for QIconEnginePlugin
 _ZTV17QIconEnginePlugin: 22 entries
 0     (int (*)(...)) 0
 8     (int (*)(...)) (& _ZTI17QIconEnginePlugin)
 16    (int (*)(...)) QIconEnginePlugin::metaObject() const
 24    (int (*)(...)) QIconEnginePlugin::qt_metacast(char const*)
 32    (int (*)(...)) QIconEnginePlugin::qt_metacall(QMetaObject::Call, int, void**)
 40    (int (*)(...)) QIconEnginePlugin::~QIconEnginePlugin()
 48    (int (*)(...)) QIconEnginePlugin::~QIconEnginePlugin()
 56    (int (*)(...)) QObject::event(QEvent*)
 64    (int (*)(...)) QObject::eventFilter(QObject*, QEvent*)
 72    (int (*)(...)) QObject::timerEvent(QTimerEvent*)
 80    (int (*)(...)) QObject::childEvent(QChildEvent*)
 88    (int (*)(...)) QObject::customEvent(QEvent*)
 96    (int (*)(...)) QObject::connectNotify(char const*)
 104   (int (*)(...)) QObject::disconnectNotify(char const*)
 112   (int (*)(...)) __cxa_pure_virtual
 120   (int (*)(...)) __cxa_pure_virtual
 128   (int (*)(...)) -0x00000000000010
 136   (int (*)(...)) (& _ZTI17QIconEnginePlugin)
 144   (int (*)(...)) _ZThn16_N17QIconEnginePluginD1Ev
 152   (int (*)(...)) _ZThn16_N17QIconEnginePluginD0Ev
 160   (int (*)(...)) __cxa_pure_virtual
 168   (int (*)(...)) __cxa_pure_virtual

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.