Странный баг отрисовки в Windows

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 28.07.2015 (Вт) 15:42

Если же интересно, как баги выглядят и как проявляются, то вот фотосессия.

Skype как раз был запущен.

Одно из характерных проявлений — штатный просмотрщик изображений не может показывать картинки вот с такой формулировкой:
Изображение

При ресайзе этого окна происходит пересоздание битмапа (под новые габариты), и процентах в 10 это пересоздание оказывается успешным и картинка проявляется. То есть изображение то появляется, то исчезает с изменением размера окна хотя бы на 1 px.

Привычно открываю SnagIt — чтобы снять то, что выше (пришлось сфотографировать). SnagIt, естественно, не может снять скриншот, зато его окно (открывшееся на другом мониторе) просвечивает то, что оказалось под ним:
Изображение

Словно WM_ERASEBKGND не сработал. Именно так: дело точно не в том, что у окна такой причудливый clip region или что оно слоёное. Весь этот графический мусор, оказавшийся внутри региона окна будет перемещаться вместе с окном при передвижении окна (как это штатно бывает — перетаскивание окна двигает растр).

Разворачиваю окно Скайпа: у него верхушка отрисовалась, а элемент со списком контактов — не отрисовался вообще, а поэтому просвечивает окно браузера и вьювера картинок.
Изображение

Если водить мышкой над списком контактов, то конечно соответствующие элементы начинают рисоваться. То есть само по себе приложение, реагируя на WM_MOUSEMOVE, какую-то свою оконную графику перерисовывать может. А вот самоотрисовка по WM_PAINT и WM_NCPAINT — хромает.

Например вот:
Изображение
При проведении над «Echo / Sound Test Service» мышкой этот айтем перерисовался. Белый фон и прочие айтемы, естественно, нет.

Окно SnagIt'а, тем временем, заполняется фрагментами собственной графики и мусором, оставшимся от отрисовки поверх него окна Скайпа:
Изображение

А окно Скайпа — фрагментами окна SnagIt'а, которые при прокрутке контакт-листа только оставляют за собой шлейф:
Изображение

Тут следует напомнить, как обычно реализуются скроллируемые контейнеры: при получении WM_MOUSEWHEEL код внутри WindowProc дёргает какую-то общую функцию, ответственную за скроллинг, ту же, которую дёргают обработчики сообщений от скроллбаров. Эта функция вызывает API-функцию ScrollWindow, которая просто сдвигает растр (копированием, вероятно, с помощью BitBlt), а затем — InvalidateRect (или InvalidateRgn), помечая участок, на месте которого должна появиться новая графика (ранее скрытая, но появляющаяся на новом месте в результате скроллинга). В результате вызова InvalidateRect в очередь сообщений прилетает сообщение WM_PAINT, которое заставляет WindowProc окна перерисовать фрагментик, на месте которого должна появиться новая графика.

В нашем случае всё так, но WM_PAINT не обрабатывается успешно. Так что картина вполне ожидаемая и объяснимая.


Баг с недообработкой WM_NCPAINT (когда у вновь появляющихся окон отсутствует синяя полоса заголовка) я поймать в этот раз не смог.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Странный баг отрисовки в Windows

Сообщение Mikle » 28.07.2015 (Вт) 16:34

SP3 на винду установлен? Возраст дров соответствует хотя бы возрасту SP3?
Я вспомнил, что лет десять назад у меня было подобное, поборол обновлением, как бы не SP3 как раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 28.07.2015 (Вт) 16:42

Mikle писал(а):SP3 на винду установлен?

Разумеется. SP3 и все хотфиксы.

Mikle писал(а):Возраст дров соответствует хотя бы возрасту SP3?

Не понял, какое должно быть соответствие? SP3 вышел много раньше появления i7 и драйверов к его интегрированному видео. Но позже появления GeForce 6200 и драйверов к нему. Это одно. Другое дело, что SP3 и все драйверы благополучно работали до этого ~11 июля.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Странный баг отрисовки в Windows

Сообщение Mikle » 28.07.2015 (Вт) 17:38

Хакер писал(а):SP3 вышел много раньше появления i7 и драйверов к его интегрированному видео. Но позже появления GeForce 6200 и драйверов к нему.

Не понял, при чём тут GeForce 6200, на счёт i7 - согласен, не может быть сильно старым, и драйвер видео, очевидно, из одного комплекта с дровами чипсета мамки, не может не соответствовать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 28.07.2015 (Вт) 17:41

Mikle писал(а):Не понял, при чём тут GeForce 6200

При том, что это один из двух видеоадаптеров, используемый в текущей конфигурации для вывода видео на один из мониторов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Странный баг отрисовки в Windows

Сообщение pronto » 28.07.2015 (Вт) 17:44

На всякий случай можно обновить драйвер для встройки :roll:
O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 28.07.2015 (Вт) 17:54

Если бы был виноват драйвер какого-то конкретного адаптера, глюки присутствовали бы исключительно на одном мониторе. И не было бы проблем с вставкой картинки из буфера обмена.

Было очень похоже на проблемы с памятью, но не похоже.

Если же драйвер виноват не напрямую, а косвенно (портит ядерные структуры), то это может быть вообще любой внезапно сбесившися драйвер.

Тут бы поотлаживать, но времени нет. Пока что на уровне угадайки всё.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Странный баг отрисовки в Windows

Сообщение iGrok » 28.07.2015 (Вт) 18:32

А ты смотрел кол-во объектов GDI?
Оно там не подходит к пределу, случаем? А то проявления ну очень уж похожи.
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 28.07.2015 (Вт) 19:25

iGrok писал(а):А ты смотрел кол-во объектов GDI?

Общее количество объектов не показывает ни taskmgr, ни Process Explorer.
До теоретического лимита в 64K вроде как далеко. Практический лимит чтобы измерить у меня под рукой ничего нет.

По отдельным числам в соответствующих графах не скадывается впечатления, что превышен лимит.Хотя по проявлениям действительно очень похоже. Надо бы сделать более точный замер при появлении следующих багов.

Сейчас вот Скайп запущен, а багов нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Странный баг отрисовки в Windows

Сообщение iGrok » 29.07.2015 (Ср) 1:35

Я когда-то зачем-то делал "считалку" используемых объектов gdi/user (во вложении).
Вложения
GuiObjScan.zip
(253.68 Кб) Скачиваний: 153
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.07.2015 (Ср) 1:47

Так.. Про скайп.

Я сталкивался с такой же отрисовкой части его окна в семёрке. Но другие окна это не затрагивало. Просто какой-то кусок окна скайпа, как правило, область в районе аватарки, сохранял то, что было в этом месте экрана на момент разворачивания окна. Если не изменяет память, при изменении размера окна эта штука двигалась вместе с ним, но при разворачивании/сворачивании другого окна поверх - перерисовывалась на содержимое этого самого онка. Даже могли где-то скриншоты сохраниться. На наведение мыши этот фрагмент окна точно не отрисовывался, хотя не уверен, содержались ли там хоть какие-то интерактивные компоненты - кажется, что нет.

И была ещё одна проблема со скайпом. Его иконка на панели задач "синхронизировалась" с другой иконкой некой программы. Ровно одной. Т. е. кнопки этой программы и скайпа всегда имели одинаковые иконки - либо обе скайповские, либо обе той программы. При закрытии второй программы это дело как бы заражало каукю-либо другую - вновь синхронизация двух кнопок. То, какая именно иконка отображалось зависело от сворачивания-разворачивания этих программ. Т. е. в случае такой "синхронизации" я мог определёнными действиями получить любую из двух иконок. Тоже скриншоты где-то были.

В обоих случаях скриншоты делались нормально и на них было то же самое, что на экране.

PS: Хакер, что-то не пойму, твои два поста чем-то отличаются или нет?

PPS: Хакер, теперь я знаю твой скайп, несмотря на то, что логин ты замазал - уникальный результат ищется по трём словам. Хотя я и так его почти угадал - в один символ только разница. Анонимность в сети держится на безразличии :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 29.07.2015 (Ср) 3:08

iGrok писал(а):Я когда-то зачем-то делал "считалку" используемых объектов gdi/user (во вложении).

А зачем на дельфи? :)

Qwertiy писал(а):PS: Хакер, что-то не пойму, твои два поста чем-то отличаются или нет?

Номером страницы, на которой они отображаются.

Qwertiy писал(а):PPS: Хакер, теперь я знаю твой скайп, несмотря на то, что логин ты замазал - уникальный результат ищется по трём словам.

От людей, которые могут, приложив когнитивные усилия, его вычислить, мне его скрывать и не надо. Это от наплыва людей «помоги взломать контакик», которые ломятся потоком в прочие мессенджеры, и каких-нибудь интеллектуальных спам-ботов нового поколения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Странный баг отрисовки в Windows

Сообщение iGrok » 29.07.2015 (Ср) 4:28

Хакер писал(а):А зачем на дельфи?

А какая IDE была открыта в тот момент, в той и набросал. :)
Переписывать его потом уже было как-то совсем незачем. :)
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 29.07.2015 (Ср) 20:08

Сейчас баги есть. Результат замера вышеприаттаченной тулзой:
Код: Выделить всё
Processes: 94; gdi: 12037; user: 4079


Лидер — FireFox. Затем Skype и Explorer.
До теоретического лимита ещё далеко.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 30.07.2015 (Чт) 11:41

Баг есть, Скайп работает:
Processes: 92; gdi: 10625; user: 5060
Убиваем Скайп — баг сразу пропадает:
Processes: 91; gdi: 9633; user: 4915
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Странный баг отрисовки в Windows

Сообщение pronto » 30.07.2015 (Чт) 12:06

O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 31.07.2015 (Пт) 7:29

Вот ещё пример бага.

Стоило только запустить Скайп, в ту же секунду Фотошоп заглючил. Убиваю Скайп — и сразу же всё нормализуется.
Вложения
skype+ps.PNG
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Странный баг отрисовки в Windows

Сообщение Mikle » 31.07.2015 (Пт) 9:21

Хакер писал(а):Стоило только запустить Скайп, в ту же секунду Фотошоп заглючил. Убиваю Скайп — и сразу же всё нормализуется.

Значит, всё-таки, не моя игра виновата :)
Вангую - скайп обновился, и теперь содержит злонамеренный баг от Микрософта, направленный на дискредитацию XP, на более новых ОС его не будет.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Странный баг отрисовки в Windows

Сообщение BV » 04.08.2015 (Вт) 17:28

Может, к Скайпу был установлен какой-то аддон, который делает инжект во все процессы посредством хука или спласинга/прокси-библиотеки, и перехватывает обработку PAINT-сообщений?

Еще по поводу Скайпа, у меня дома уже довольно давно на старой машине с XP SP3 успешно работает Скайп версии 6.21. Установочка так же в наличии имеется, могу поделиться.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 04.08.2015 (Вт) 17:33

BV писал(а):Установочка так же в наличии имеется, могу поделиться.

Поделись пожалуйста. Задоблался. Провожу митинги с несколькими людьми, и посреди митингов всё ломается до невозможности работы.

У меня версия 7.6. Надеюсь твоя версия с отключаемым автообновлением (или его там вообще нет).

BV писал(а):Может, к Скайпу был установлен какой-то аддон, который делает инжект во все процессы посредством хука или спласинга/прокси-библиотеки, и перехватывает обработку PAINT-сообщений?

Предположение несколько противоречит наблюдаемым фактам:
  1. При убивании процесса из диспетчера задач инжект по идее не должен сниматься и отменяться автоматически. Между тем, убивание мгновенно исцеляет баги. Хотя признаю, что инжектируемые исполняемые сущности могут мгновенно отслеживать смерть своего хост-процесса и переставать работать.
  2. Это всё вываливается в частые BSOD-ы с упоминанием драйвера igxprd32. Это при том, что работаю я, конечно же не под админом. То, что один непривилигированный процесс может портить жизнь всей сессии и вообще крашить машину — это возмутительно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Странный баг отрисовки в Windows

Сообщение BV » 04.08.2015 (Вт) 17:41

Хакер писал(а):Поделись пожалуйста.

Ок, скоро доберусь до домашней машины -- залью в облако.

Хакер писал(а):Надеюсь твоя версия с отключаемым автообновлением

Сама по себе -- нет. Но есть проверенная методика перманентного избавления от этой привычки: в %temp% создаем файл SkypeSetup.exe и запрещаем запись для текущего пользователя. Проверять-то он, конечно, не перестанет, а вот скачать и применить апдейт не сможет.

Хакер писал(а):Хотя признаю, что инжектируемые исполняемые сущности могут мгновенно отслеживать смерть своего хост-процесса и переставать работать.

Не обязательно так. Хост-процесс может взводить какой-нибудь глобальный мьютекс или еще какой-нибудь техникой IPC контролировать инжект. Я бы поглядел список подгружаемых модулей в процессах до и после запуска Скайпа.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Странный баг отрисовки в Windows

Сообщение BV » 04.08.2015 (Вт) 20:05

const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Странный баг отрисовки в Windows

Сообщение Хакер » 04.08.2015 (Вт) 23:03

BV писал(а):SkypeSetup 6.21

Спасибо. Скачал и установил. А то что-то Old Version плохо работает, так и не смог слить оттуда.

После установки кое-что поменялось. Теперь нет всеобщих графических лагов, но Скайп жутки виснет, стоит хотя бы единожды открыть окно группового чата. При этом по какой-то причине подвешиванию подвергается и JIRA Client от ALM Works.

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

Выглядят так:
01.png
01.png (38.8 Кб) Просмотров: 7864


Иногда отрисовывается статус-бар и полосочка с кругляшочком:
02.png
02.png (31.56 Кб) Просмотров: 7864
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Странный баг отрисовки в Windows

Сообщение BV » 05.08.2015 (Ср) 1:16

Ну, что могу сказать.. попробуй переустановить "вчистую", с удалением всего его добра из %appdata% и реестра. Вариантов не много: или где-то проблема с его файлами, или таки аддон/сторонний софт, имеющий какое-то отношение к Скайпу.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Пред.

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList