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