Vtable Dumper - инструмент для просмотра виртуальных таблиц библиотеки
Поддержка обратной совместимости внешних 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
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.