Странный баг при переносе программы и смене версии Qt, как отлавливать?
Доброго времени.
Очень странный баг начал происходить и я не знаю как проверить.
Программа была написана на Qt 4.8, грузил стороннюю библиотеку.
Долгое время работало, всё ок.
Перешёл на Qt 5.4
Программа стала вылетать при запуске, точно установил, что вылетает в работе у подключаемой библиотеки.
Но ничего по работе с библиотекой не менял (ни прямо ни косвенно, просто для начала обновил) при переходе на новую версию Qt не менял!
Отладка осложняется тем, что это библиотека по работе со сторонним оборудованием и подключение только удалённое.
Как можно выловить, почему изменилось поведение?
Не устанавливая среду разработки на целевой системе и по возможности вообще там ничего не устанавливая, т.е. стандартными средствами Qt или операционки?
Т.е. удалённая отладка.
Целевая операционка Win 7 Embeded
Ваша программа, новый Qt и эта "библиотека" под одной студией собраны? Если райнтамы разные, и вы обмениваетесь с библиотекой объектами STL-ных классов, то ничего хорошего не будет. Или экзмеплярами классов и структур Qt. Даже передача какого-нибудь QModelIndex может вызвать проблемы, если приложение и библиотека собраны под разные версии С++ runtime (в случае разных райнтаймов передавать по значению можно только примитивные типы, ну или указатели на объекты, которые "живут" внутри библиотеки, т.е. ей создаются, ей уничтожаются и живут в её же куче. тогда проблем быть не должно).
Нет. Библиотека грузится, первоначальные функции вызываются. Падение происходит то ли при вызове функции то ли уже внутри библиотеки. Т.е. то ли ей перестали нравится аргументы то ли ещё чего не могу выяснить, ставлю везде сейчас qDebug за неимением другого =(
Pavel K: А, то есть не WinAPI... Я бы предложил все ж LoadLibrary + GetProcAddress, надежнее оно как-то. Касательно размеров: размер может быть тот же, но порядок следования методов в виртуальных таблицах мог поменяться и теперь вместо одного метода вызывается другой.
Pavel K: Ну так версия Qt поменялась, поменялись свещения в vtable, так что если DLL использует Qt - я бы смотрел в это место. Если есть данные об адресе падения - можно в Иде глянуть что за метод.