ДЧ
Дмитрий Черновол16 февраля 2017 г. 12:32

Почему один и тот же код работает по разному на Windows и Linux?

Я ниже по постам задавал вопрос, о том что программа вылетает и бла-бла-бла. Так вот. Скомпилировал я значит эту программу под линуксом, подключаю устройство (модуль Modbus Slave). Захожу в графики, и начинаю с ними играть. И вот уже 45 000 пакетов и программа не вылетает. Никаких помех, код работает как часы. А под виндой, если двигать графики, сразу "Прекращена работы программы "бла бла бла"" Вот почему так? Под линуксом хорошо, а под виндой такие дела?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

6
ДЧ
  • 16 февраля 2017 г. 12:36

Вот

    Evgenii Legotckoi
    • 16 февраля 2017 г. 13:10

    Потому, что любая кроссплатформенная библиотека подразумевает несколько бэкендов, которые выбираются настройками проекта при компилировании программы (так называемый Pimpl, использование Private API). Степень качества работы конкретного бэкенда будет естественно зависеть от профессиональных навыков разработчика, который занимается развитием данного бэкенда. Также на качество работы влияет API самой операционной системы.

    Скриншот, который Вы привели, абсолютно ничего не говорит о специфике проблемы, кроме того, что проблема имеется.

    Разработка бэкендов для кросплатформенной библиотеки естественно зачастую ведётся несколькими разработчиками, у каждого из которых свой собственный профиль: WinAPI, X11, MAC OS API, что характерно для крупных проектов, поскольку трудно быть Гуру во всех трёх направлениях одновременно, тем не менее уровень навыков специалистов будет различен по отношению к целевым API. То есть над WinAPI может работать специалист уровня Team Lead, а над X11 специалист уровня Middle.

    Также проблемы могут создавать сами API Операционной Системы. Например, написать Key Logger для Windows на мой взгляд проще, чем для Linux, просто потому, что под Windows есть заточенное под это API, так называемые Хуки, а под Linux такого нет, хотя имеется возможность захвата событий клавиатуры, но их потом ещё нужно правильно вернуть обратно в систему, что требует несколько больших навыков и знаний, чем при работе с WinAPI.

    А ещё проблемы может создавать компилятор )))) Было одно обсуждение, в котором обсуждалась утечка памяти при работе с WinAPI ICMP Ping, как выяснилось через пару недель, проблему создавал компилятор. Тот же самый код при сборке другим компилятором работал без утечек памяти при выполнении функций из WinAPI.

    Вывод: Причин такого поведения может быть множество.

    Решение: Использовать другие библиотеки, пробовать другие средства сборки, искать обходные пути (то есть костылировать проблему).

      ДЧ
      • 16 февраля 2017 г. 13:14

      Та как же её костылировать? Я бы рад...

        Evgenii Legotckoi
        • 16 февраля 2017 г. 13:22

        Понятия не имею ...

        Кроме одного скриншота и небольшого описания проблемы, Вы ничего не показывали, ни логов вывода, ни попыток дебагинга, где ложится программа. Ни программного кода, где происходит падение программы. Ничего, что могло бы натолкнуть на мысли о каком-нибудь совете, который помог бы Вам решить проблему.

        Запустите проект в режиме отладки и посмотрите в каком месте программы, в каком методе, происходит падение программы. Что вызывает проблему и т.д. и т.п.

          ДЧ
          • 16 февраля 2017 г. 13:47

          Приложение остановлено, так как оно получило сигнал от операционной системы. Сигнал: SIGSEGV Назначение: Segmentation fault И это только тогда когда начинаю двигать полотно графика. Как будто идёт какая-то помеха, которая мешает протоколу общаться с устройством. Как показано на скриншоте, то там ошибка в библиотеке qmodbusrtuserialmaster. Я на это не грешу. Мне кажется что проблема в моём коде. А иногда ошибка вываливается в ассемблерском файле. Я пытался отловить qDebug()-ом. Но и там такая ересь бывает просто. Было бы замечательно, если бы Вы выделили 10 минут на меня. И Вы бы по Team Viewer увидели проблему. Есть такие проблемы, что сложно отловить отладчиком.

            Evgenii Legotckoi
            • 16 февраля 2017 г. 20:02

            Сейчас у меня катастрофически не хватает времени на всё, так что насчёт Team Viewer не знаю. Тем более, что 10-ю минутами здесь не обойтись явно ...

            Если учесть Segmentation Fault, то видимо у Вас там обращение идёт к какому-то объекту раньше, чем он был инициализован. Вполне возможно, что как раз объект у qmodbusrtuserialmaster был недоинициализован. Впрочем, qmodbusrtuserialmaster - это довольно новый класс, его ввели только в Qt 5.6, так что баги могут быть под различными ОС.

            Поставьте точку останова в начале обработки сдвига на графике и проследите работу кода до момента падения программы. В том числе с просмотром содержимого переменных, по которым будет проходить алгоритм программы.

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              Ua

              Qt - Тест 001. Сигналы и слоты

              • Результат:84баллов,
              • Очки рейтинга4
              Ua

              Qt - Тест 001. Сигналы и слоты

              • Результат:42баллов,
              • Очки рейтинга-8
              ОК

              Qt - Тест 001. Сигналы и слоты

              • Результат:47баллов,
              • Очки рейтинга-6
              Последние комментарии
              ИМ
              Игорь Максимов22 ноября 2024 г. 21:51
              Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii Legotckoi31 октября 2024 г. 23:37
              Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZE19 октября 2024 г. 17:19
              Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов5 октября 2024 г. 16:51
              Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas55 июля 2024 г. 20:02
              QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Сейчас обсуждают на форуме
              f
              firstlunoxod15 февраля 2025 г. 13:46
              Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
              Дмитрий
              Дмитрий3 февраля 2025 г. 16:24
              Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
              NW
              Nayo Wai30 января 2025 г. 19:22
              не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
              n
              nkly3 января 2025 г. 12:52
              Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
              M
              Marsel17 августа 2023 г. 0:26
              OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

              Следите за нами в социальных сетях