http://wiki.rosalab.com/ru/index.php?title=%D0%91%D0%BB%D0%BE%D0%B3:%D0%A2%D0%BE%D1%87%D0%BA%D0%B0_%D0%A0%D0%BE%D1%81%D1%8B/Vtable_Dumper_-_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B0_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8&feed=atom&action=historyБлог:Точка Росы/Vtable Dumper - инструмент для просмотра виртуальных таблиц библиотеки - История изменений2024-03-28T19:03:09ZИстория изменений этой страницы в викиMediaWiki 1.26.4http://wiki.rosalab.com/ru/index.php?title=%D0%91%D0%BB%D0%BE%D0%B3:%D0%A2%D0%BE%D1%87%D0%BA%D0%B0_%D0%A0%D0%BE%D1%81%D1%8B/Vtable_Dumper_-_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B0_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8&diff=10085&oldid=prevStanislav.fomin в 17:04, 22 июля 20132013-07-22T17:04:24Z<p></p>
<p><b>Новая страница</b></p><div>Поддержка обратной совместимости внешних API интерфейсов является одной из наиболее важных задач при разработке библиотек. Это позволяет проще портировать существующие приложения на новые версии библиотек. Конечно это относится в первую очередь к библиотекам у которых уже есть применения, но и немаловажно для новых библиотек, поскольку при выборе библиотеки часто обращают внимание не только на функциональность, но и на стабильность. Совместимость бывает трех видов: на уровне исходных кодов, бинарная и функциональная. Наличие совместимости на уровне исходных кодов и функциональной совместимости позволяет портировать приложения путем их пересборки без необходимости модификации кода. Бинарная же совместимость является наиболее сильным уровнем совместимости и позволяет запускать старые приложения без их пересборки.<br />
<br />
Наиболее сложно поддерживать совместимость C++ библиотек, так как, по сравнению с Си-библиотеками, дополнительно используются манглинг имен функций и виртуальные таблицы, создаваемые компилятором для реализации полиморфизма классов. Виртуальные таблицы могут меняться нелинейным образом при изменении в объявлении классов (добавление или удаление функций, базовых классов, атрибутов наследования и т.д.) и любое такое изменение может привести к неопределенному поведению или падению приложений. Для контроля за составом виртуальных таблиц мы создали специальный инструмент [https://github.com/lvc/vtable-dumper Vtable Dumper], который печатает содержимое всех виртуальных таблиц найденных в бинарных файлах библиотеки. Таким образом можно сравнить вывод инструмента для старой и новой версии библиотеки, найти и предотвратить случайные изменения.<br />
<br />
Пример использования инструмента:<br />
<br />
vtable-dumper /usr/lib64/libstdc++.so.6<br />
<br />
Стоит заметить, что существует альтернативный способ изучения состава виртуальных таблиц с помощью опции ''-fdump-class-hierarchy'' компилятора GNU G++. Однако входными данными для его работы являются заголовочные файлы библиотеки и необходима их компиляция, которая может произойти с ошибками и потребовать дополнительных опций, порядка включения файлов и др. Кроме того, заголовочные файлы в отличие от бинарных файлов библиотеки не всегда установлены в системе. Форматы вывода обоих инструментов практически идентичны. Дополнительно инструмент Vtable-Dumper показывает параметры виртуальных функций в таблице и их mangled-имена (опция ''-mangled'').<br />
<br />
Далее приведен пример отображения инструментом содержимого виртуальной таблицы одного из классов библиотеки libQtGui:<br />
<br />
Vtable for QIconEnginePlugin<br />
_ZTV17QIconEnginePlugin: 22 entries<br />
0 (int (*)(...)) 0<br />
8 (int (*)(...)) (& _ZTI17QIconEnginePlugin)<br />
16 (int (*)(...)) QIconEnginePlugin::metaObject() const<br />
24 (int (*)(...)) QIconEnginePlugin::qt_metacast(char const*)<br />
32 (int (*)(...)) QIconEnginePlugin::qt_metacall(QMetaObject::Call, int, void**)<br />
40 (int (*)(...)) QIconEnginePlugin::~QIconEnginePlugin()<br />
48 (int (*)(...)) QIconEnginePlugin::~QIconEnginePlugin()<br />
56 (int (*)(...)) QObject::event(QEvent*)<br />
64 (int (*)(...)) QObject::eventFilter(QObject*, QEvent*)<br />
72 (int (*)(...)) QObject::timerEvent(QTimerEvent*)<br />
80 (int (*)(...)) QObject::childEvent(QChildEvent*)<br />
88 (int (*)(...)) QObject::customEvent(QEvent*)<br />
96 (int (*)(...)) QObject::connectNotify(char const*)<br />
104 (int (*)(...)) QObject::disconnectNotify(char const*)<br />
112 (int (*)(...)) __cxa_pure_virtual<br />
120 (int (*)(...)) __cxa_pure_virtual<br />
128 (int (*)(...)) -0x00000000000010<br />
136 (int (*)(...)) (& _ZTI17QIconEnginePlugin)<br />
144 (int (*)(...)) _ZThn16_N17QIconEnginePluginD1Ev<br />
152 (int (*)(...)) _ZThn16_N17QIconEnginePluginD0Ev<br />
160 (int (*)(...)) __cxa_pure_virtual<br />
168 (int (*)(...)) __cxa_pure_virtual<br />
{{wl-publish: 2013-05-14 11:29:49 +0400 | Andrey.ponomarenko }}<br />
<br />
[[Category:ToROSAPoint]]</div>Stanislav.fomin