Подтвердить что ты не робот

Стираемые компоненты в программе Delphi

Обновление

2016-02-18: Добавлена ​​информация о процессе


У меня есть программа Delphi, скомпилированная с использованием XE4. Он используется несколькими сотнями клиентов. Несколько недель назад один из этих клиентов сообщил, что некоторые области исполняемого файла стирались (изображения ниже) случайным образом в течение дня. Этот клиент имеет 35 сайтов, использующих этот exe, и проблема возникает не более чем на 10 из этих сайтов.

Исследование

1 - Мое первое подозрение было бесконечным циклом. Exe продолжает реагировать, пока компоненты стираются, ничто не изменилось в коде так радикально с момента, когда эта проблема не произошла, и журналы не показывают никакого цикла (этот exe имеет журналы везде).

2 - Неверные темы. У меня есть отдельный поток, который синхронизирует данные между этим exe и нашим сервером в облаке. Опять же, журналы не показывают, что поток работает, когда проблема возникает, и снова ничего здесь не было.

3 - Некоторая другая программа (антивирус?) влияет на мой exe. Не удалось расследовать этот hipotesis правильно, но до сих пор не удалось найти какую-либо установленную программу, которая привлекла мое внимание.

Мой вопрос: что может быть причиной этой проблемы? Как я могу продолжить исследование? Я знаю, что это может быть широкий вопрос, но это вся информация, которую я мог бы собрать, и я не могу представить много других мест, чтобы посмотреть.

Изображения

1 - На рисунке ниже красная область должна быть TToolBar

стертый TToolBar

2 - На этом втором изображении есть три области: от верхней до нижней, первая должна быть TToolBar, вторая должна быть названием дочерней формы, а третья должна быть TwwDBGrid

Меню, название и TwwDBGrid стерты

3 - Третий пример показывает сверху стертую область, где должен быть TEdit, просто нажмите там, где должна быть строка на TwwDBGrid, а на стороне мы видим стертую полосу прокрутки из TwwDBGrid

Tedit, строка и scroolbar erased

4 - В этом последнем примере показано 5 удаленных областей: название приложения, основной TToolBar, название формы, TButton и два TwwDBGrid

введите описание изображения здесь

5 - Это интересный пример, за исключением удаленных компонентов есть четыре TSpeedButtons, которые не стираются, но они не имеют изображений, которые они изначально (первые красные поглаженные области). Остальные 3 красные поглаженные области, по порядку, 2 TEdits, TwwDBGrd и TButton

введите описание изображения здесь

Информация о процессе

У меня появился скриншот того, что проблема возникает. scgolr - это мое программное обеспечение.

введите описание изображения здесь

4b9b3361

Ответ 1

проблема связана с сайтом банковского плагина безопасности (Варшава - газовая техника), который ваш клиент имеет доступ, обновляет его и будет решен, проблема в Бразилии

Ответ 2

На самом деле недостаточно подробной информации, чтобы дать вам определенный ответ. Тем не менее, я могу ответить несколькими направлениями на ваш вопрос:

Как я могу продолжить исследование?

Из-за того, что вы заявили:

  • Программа используется несколькими сотнями клиентов
  • Один (только) клиент испытывает проблему.
  • Первое появление проблемы было несколько недель назад.

первое, что нужно сделать, это связаться с клиентом и получить информацию, которую вы говорите, о которой вы просили, но не получили. На вопросы, на которые нужно ответить, входят:

  • Что изменилось в среде клиентов в то время, когда проблема началось в отношении аппаратного обеспечения, сети, сервера, ОС, другого программного обеспечения работает на ПК?
  • Что-то изменилось в том, как ваш клиент использует ваше программное обеспечение?
  • Что клиент должен делать, чтобы избавиться от проблемы, как только это произойдет? Закройте программу? Перезагрузите компьютер? Или просто свернуть - восстановить ошибочное окно?

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

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

  • Вы вызываете Application.ProcessMessages в любое время?
  • Поддерживает ли фоновый поток те же данные, что и графический интерфейс? Если да, правильно ли установлены защита данных (блокировка, синхронизация).
  • Поддерживает ли фоновый поток какие-либо компоненты GUI без Synchronize?

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


Изменить после получения информации о процессе.

Нет ничего тревожного в отношении объектов GDI или User. Но вызывает тревогу, когда вы говорите в комментариях, которые вы называете Application.ProcessMessages во многих местах, очевидно, чтобы "исправить" невосприимчивый пользовательский интерфейс. Например, что произойдет, если пользователь дважды щелкнет кнопку, но делает это достаточно медленно, чтобы Windows обнаружила его как отдельный клик? Первый клик может начать длительную процедуру, в течение которой вы вызываете A.P.. Второй клик считывается из очереди сообщений, которая запускает ту же процедуру. Теперь второй вызов процедуры выполняется (со своими вызовами на A.P.) и в конце концов заканчивается, и выполнение возвращается к первому вызову. В зависимости от того, что вы делаете в этой процедуре, вы вполне можете испортить ручки и контексты устройств и т.д. Сильная рекомендация с дружеским намерением: избавиться от этих вызовов A.P.

Ответ 3

Как отмечали @SebastianZ и @AlekseyK, вы можете экспериментировать с exaustin некоторого ресурса GDI (обрабатывает?). Если к системе можно получить доступ, некоторые инструменты, такие как Process explerer или process hacker, могут дать вам несколько советов. Эта утилита также может помочь GDIView

Я не знаю, может ли это примениться к вашему делу, но иногда повреждение данных базы данных может привести к странному эффекту в запущенных программах (я помню "Data Bombs", вызывающие исключения из памяти...

Итак, если что-то вызывает цикл выделения GDI, графика вашего приложения будет затронута "странными" способами.