Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 10837 - 1c77 - ошибка при объединении конфигураций | wine 2.1.3   Make a simular bug
Summary: 1c77 - ошибка при объединении конфигураций | wine 2.1.3
Status: CLOSED FIXED
Alias: None
Product: WINE@Etersoft
Classification: Продукты (Products)
Component: Общее (show other bugs)
Version: unspecified
Hardware: PC Linux
: P4 minor
Target Milestone: ---
Assignee: Konstantin Artyushkin
QA Contact: Konstantin Artyushkin
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 8430 9358
  Show dependency treegraph
 
In work:
Reported: 2015-10-01 17:16 MSK by Konstantin Artyushkin
Modified: 2015-11-05 13:55 MSK (History)
3 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Konstantin Artyushkin 2015-10-01 17:16:12 MSK
Запустить c:/Program Files/1Cv77/BIN/1cv7l.exe

Выбрать "Информационная база #2" и запустить в режиме конфигуратора. 
Меню -> Конфигурация -> открыть конфигурацию.
Меню -> Конфигурация -> Объединить конфигурации - выбираю по адресу С:\\update\1cv7.md

Внизу появится лог процесса, ждём таких результатов:

-Режим замещения ведущих объектов
-Загружаемая конфигурация является приоритетной
-Замещение Объекта: "Задача"
-Произошла ошибка в процессе объединения конфигураций
Comment 1 Konstantin Artyushkin 2015-10-01 17:22:16 MSK
Бутылка swine 2.1 bugs/10837 


В 1С и конфигуратор можно заходить под любым пользователем без пароля.
В данном случае воспроизводилось под пользователем Фёдоров.

!!!!! Забыл !!!!!

Проблема воспроизводится если в настройках объединения выбрать параметры:
 
Приоритет Конфигурации - Загружаемая конфигурация 
Метод Объединения      - Замещать объекты

Всего 4 варианта - воспроизвести получилось только в 1-м
Comment 2 Dmitry Timoshkov 2015-10-08 13:55:22 MSK
(Ответ Konstantin Artyushkin на комментарий0)
> Запустить c:/Program Files/1Cv77/BIN/1cv7l.exe
> 
> Выбрать "Информационная база #2" и запустить в режиме конфигуратора. 
> Меню -> Конфигурация -> открыть конфигурацию.
> Меню -> Конфигурация -> Объединить конфигурации - выбираю по адресу
> С:\\update\1cv7.md
> 
> Внизу появится лог процесса, ждём таких результатов:
> 
> -Режим замещения ведущих объектов
> -Загружаемая конфигурация является приоритетной
> -Замещение Объекта: "Задача"
> -Произошла ошибка в процессе объединения конфигураций

Проблема воспроизводится, но пока непонятно, что именно происходит и что
является ее источником.
Comment 3 Dmitry Timoshkov 2015-10-16 15:09:47 MSK
(Ответ Dmitry Timoshkov на комментарий2)
> > Выбрать "Информационная база #2" и запустить в режиме конфигуратора. 
> > Меню -> Конфигурация -> открыть конфигурацию.
> > Меню -> Конфигурация -> Объединить конфигурации - выбираю по адресу
> > С:\\update\1cv7.md
> > 
> > Внизу появится лог процесса, ждём таких результатов:
> > 
> > -Режим замещения ведущих объектов
> > -Загружаемая конфигурация является приоритетной
> > -Замещение Объекта: "Задача"
> > -Произошла ошибка в процессе объединения конфигураций
> 
> Проблема воспроизводится, но пока непонятно, что именно происходит и что
> является ее источником.

После практически безрезультатных попыток понять, что именно происходит,
было решено проверить поведение объединения конфигураций под winehq.
Мгновенно выяснилось, что 1С77 под winehq больше не запускается, происходит
падение в dlls/gdi32/freetype.c при попытке получения метрик шрифта примерно
следующим кодом:
hdc = GetDC(0);
GetTextExtentPointW(hdc, L"Пуск", &size); <- crash

Причина падения в том, что шрифт, выбранный на контекст устройства по
умолчанию "System" - битмап шрифт, а код gdi32 пытается работать с ним
как со шрифтом truetype. С ходу выяснить источник регрессии не получилось,
продолжаю разбираться.
Comment 4 Dmitry Timoshkov 2015-10-19 16:07:52 MSK
(Ответ Dmitry Timoshkov на комментарий3)
> После практически безрезультатных попыток понять, что именно происходит,
> было решено проверить поведение объединения конфигураций под winehq.
> Мгновенно выяснилось, что 1С77 под winehq больше не запускается, происходит
> падение в dlls/gdi32/freetype.c при попытке получения метрик шрифта примерно
> следующим кодом:
> hdc = GetDC(0);
> GetTextExtentPointW(hdc, L"Пуск", &size); <- crash
> 
> Причина падения в том, что шрифт, выбранный на контекст устройства по
> умолчанию "System" - битмап шрифт, а код gdi32 пытается работать с ним
> как со шрифтом truetype. С ходу выяснить источник регрессии не получилось,
> продолжаю разбираться.

Падение, описанное выше, вызывается следующим образом:
1. в первом терминале запустить 'wine winver' (локаль по-умолчанию en_US.UTF-8)
2. во втором терпинале запустить 1С с LANG=ru_RU.UTF-8 - бух - падение.
Хотя это довольно необычная ситуация, но тем не менее падать ничего не должно.
Так как причина падения понятна и тратить время на исследование этой проблемы
дальше нет смысла - откладываю исследование падения в сторону (возможно до
дождливого/морозного свободного вечера).

Что касается ошибки при объединении - здесь пока темный лес. 1С даже не
начинает какой-либо работы, а практически сразу вызывает MessageBox с
сообщением об ошибке. Было проверено несколько теорий: пока безрезультатно.
Основное подозрение на данном этапе вызывает код, работающий с MDI:
1С создает окно со стилем WS_EX_MDICHILD, но в обработчике WM_CREATE
сбрасывает этот стиль, и MDI код в wine считает, что MDI окон для работы
нет, это ведет к тому, что в ответ на сообщение WM_MDIGETACTIVE wine всегда
возвращает 0. WM_MDIGETACTIVE - это последнее, что я вижу перед созданием
окна с сообщением об ошибке. Пока это единственная теория, которую нужно
будет проверить.
Comment 5 Dmitry Timoshkov 2015-10-20 14:07:13 MSK
(Ответ Dmitry Timoshkov на комментарий4)
> > После практически безрезультатных попыток понять, что именно происходит,
> > было решено проверить поведение объединения конфигураций под winehq.
> > Мгновенно выяснилось, что 1С77 под winehq больше не запускается, происходит
> > падение в dlls/gdi32/freetype.c при попытке получения метрик шрифта примерно
> > следующим кодом:
> > hdc = GetDC(0);
> > GetTextExtentPointW(hdc, L"Пуск", &size); <- crash
> > 
> > Причина падения в том, что шрифт, выбранный на контекст устройства по
> > умолчанию "System" - битмап шрифт, а код gdi32 пытается работать с ним
> > как со шрифтом truetype. С ходу выяснить источник регрессии не получилось,
> > продолжаю разбираться.
> 
> Падение, описанное выше, вызывается следующим образом:
> 1. в первом терминале запустить 'wine winver' (локаль по-умолчанию
> en_US.UTF-8)
> 2. во втором терпинале запустить 1С с LANG=ru_RU.UTF-8 - бух - падение.
> Хотя это довольно необычная ситуация, но тем не менее падать ничего не
> должно.
> Так как причина падения понятна и тратить время на исследование этой проблемы
> дальше нет смысла - откладываю исследование падения в сторону (возможно до
> дождливого/морозного свободного вечера).

Префикс, указанный в задаче 10868 полностью повторяет описанную выше проблему
и в этом префиксе падение при вызове GetTextExtentPointW() воспроизводится
со 100% вероятностью и не зависит от локали и запущена или нет еще какая-то
программа в этом префиксе. Поэтому пришлось исследовать проблему и искать
причины и возможное решение.

Как оказалось, падение вызвано порчей памяти, при чем порча памяти происходит
исключительно тогда, когда GetFileAttributes() возвращает ошибку для файла
шрифта, и ошибка GetFileAttributes() вызвана тем, что файл шрифта находится
вне используемого wine префикса, где-то в /usr/share/fonts и при этом диск
z:, указывающий на / (и позволяющий обращаться к файлам вне префикса через
ссылку z:->/) не существует (вернее специально удален по соображениям
безопасности). Так как конфигурация без ссылки z:->/ используется крайне
редко (а может вообще нигде не используется кроме W@E), то поэтому данная
проблема не была обнаружена до сих пор.

Патч, исправляющий порчу памяти, отправлен в wine-patches.
Comment 6 Dmitry Timoshkov 2015-10-21 12:59:10 MSK
(Ответ Dmitry Timoshkov на комментарий5)
> Префикс, указанный в задаче 10868 полностью повторяет описанную выше проблему
> и в этом префиксе падение при вызове GetTextExtentPointW() воспроизводится
> со 100% вероятностью и не зависит от локали и запущена или нет еще какая-то
> программа в этом префиксе. Поэтому пришлось исследовать проблему и искать
> причины и возможное решение.
> 
> Как оказалось, падение вызвано порчей памяти, при чем порча памяти происходит
> исключительно тогда, когда GetFileAttributes() возвращает ошибку для файла
> шрифта, и ошибка GetFileAttributes() вызвана тем, что файл шрифта находится
> вне используемого wine префикса, где-то в /usr/share/fonts и при этом диск
> z:, указывающий на / (и позволяющий обращаться к файлам вне префикса через
> ссылку z:->/) не существует (вернее специально удален по соображениям
> безопасности). Так как конфигурация без ссылки z:->/ используется крайне
> редко (а может вообще нигде не используется кроме W@E), то поэтому данная
> проблема не была обнаружена до сих пор.
> 
> Патч, исправляющий порчу памяти, отправлен в wine-patches.

Патч принят.
Comment 7 Dmitry Timoshkov 2015-10-26 14:56:55 MSK
(Ответ Dmitry Timoshkov на комментарий4)
> Что касается ошибки при объединении - здесь пока темный лес. 1С даже не
> начинает какой-либо работы, а практически сразу вызывает MessageBox с
> сообщением об ошибке. Было проверено несколько теорий: пока безрезультатно.
> Основное подозрение на данном этапе вызывает код, работающий с MDI:
> 1С создает окно со стилем WS_EX_MDICHILD, но в обработчике WM_CREATE
> сбрасывает этот стиль, и MDI код в wine считает, что MDI окон для работы
> нет, это ведет к тому, что в ответ на сообщение WM_MDIGETACTIVE wine всегда
> возвращает 0. WM_MDIGETACTIVE - это последнее, что я вижу перед созданием
> окна с сообщением об ошибке. Пока это единственная теория, которую нужно
> будет проверить.

Добавил пачку тестов для WM_MDIGETACTIVE, и новые тесты показывают несколько
неожиданное поведение под wine - они терпят неудачу в самых различных местах.
Отправил патчи с тестами в wine-patches и начал разбираться с причинами
неудач в тестах.
Comment 8 Dmitry Timoshkov 2015-10-28 14:35:55 MSK
(Ответ Dmitry Timoshkov на комментарий7)
> > Что касается ошибки при объединении - здесь пока темный лес. 1С даже не
> > начинает какой-либо работы, а практически сразу вызывает MessageBox с
> > сообщением об ошибке. Было проверено несколько теорий: пока безрезультатно.
> > Основное подозрение на данном этапе вызывает код, работающий с MDI:
> > 1С создает окно со стилем WS_EX_MDICHILD, но в обработчике WM_CREATE
> > сбрасывает этот стиль, и MDI код в wine считает, что MDI окон для работы
> > нет, это ведет к тому, что в ответ на сообщение WM_MDIGETACTIVE wine всегда
> > возвращает 0. WM_MDIGETACTIVE - это последнее, что я вижу перед созданием
> > окна с сообщением об ошибке. Пока это единственная теория, которую нужно
> > будет проверить.
> 
> Добавил пачку тестов для WM_MDIGETACTIVE, и новые тесты показывают несколько
> неожиданное поведение под wine - они терпят неудачу в самых различных местах.
> Отправил патчи с тестами в wine-patches и начал разбираться с причинами
> неудач в тестах.

Патчи с тестами приняты. Добавил несколько тестов, повторяющих действия 1С
при создании MDI дочернего окна, так же продолжил исследование причин неудач
в тестах.
Comment 9 Dmitry Timoshkov 2015-10-29 14:39:37 MSK
Совершенно слуйчано заметил, что данная задача блокирует задачу 8430. Чтение
комментариев к задаче 8430 показало, что эта задача 10837 фактически является
повтором задачи 8430, и Сергей Гуральник в рамках исследования задачи 8430
уже выяснил, что использование ole32.dll из Windows XP позволяет выполнить
объединение конфигураций в 1С без ошибок.

Как только мне стало известно о том, что проблема скорее всего находится
в ole32, то было уже естественно проверить и подтвердить, что использование
ole32=n действительно решает проблему объединения конфигураций. Имея эту
информацию изначально, можно было бы избежать потери времени на новое
исследование проблемы.

Далее использование правильных каналов отладочных сообщений и добавление
множества новых позволило выяснить точное место возникновения проблемы:
почти сразу за вызовом IEnumSTATSTG::Next() 1С вызывает IStorage::Revert()
и выводит сообщение об ошибке. Кстати, это объясняет, почему +relay log
не позволяет видеть практически вообще никакой активности: работа с IStorage
происходит с использованием таблицы виртуальных методов, которые не видны
при отладке с помощью +relay.

Дальнейшее исследование свелось к экспериментам и написанию нового теста
для IEnumSTATSTG::Next(). В процессе исследованиея одно из предположений
подтвердилось: IEnumSTATSTG::Next() в случае завершения перечесления всех
элементов должен не просто вернуть S_FALSE, но и полностью обнулить структуру
данных, переданную приложением. Как только было добавлено обнуление структуры
при возврате S_FALSE, 1С сразу же смогла полностью выполнить и завершить
объединение конфигураций. Но, по завершении объединения 1С начала сообщать
об ошибке открытия документа. Дальнейшее исследование показало, что это
та же самая проблема, что и в задаче 10868, и приложение патчей, решающих
проблему в той задаче, позволяют избежать сообщений об ошибке и по окончании
объединения конфигураций.

Патчи с тестами и исправлением для IEnumSTATSTG::Next() отправлены в
wine-patches.
Comment 10 Dmitry Timoshkov 2015-10-29 14:43:08 MSK
(Ответ Dmitry Timoshkov на комментарий9)
> Совершенно слуйчано заметил, что данная задача блокирует задачу 8430. Чтение
> комментариев к задаче 8430 показало, что эта задача 10837 фактически является
> повтором задачи 8430, и Сергей Гуральник в рамках исследования задачи 8430
> уже выяснил, что использование ole32.dll из Windows XP позволяет выполнить
> объединение конфигураций в 1С без ошибок.

Константин, в чем причина создания повтров для уже существующих задач к тому
же без явного указания, что это фактический повтор? Такая практика распыляет
информацию по разным задачам и ведет к потере уже известных результатов
исследований, и как результат ведет к повторному исследованию возможно уже
исследованных проблем.
Comment 11 Konstantin Artyushkin 2015-10-29 15:59:23 MSK
(Ответ Dmitry Timoshkov на комментарий10)
 объединение конфигураций в 1С без ошибок.
> 
> Константин, в чем причина создания повтров для уже существующих задач к тому
> же без явного указания, что это фактический повтор? Такая практика распыляет
> информацию по разным задачам и ведет к потере уже известных результатов
> исследований, и как результат ведет к повторному исследованию возможно уже
> исследованных проблем.

Многие бутылки и файлы из задания 8430 уже не актуальны, было решено воспроизвести и вынести в отдельное задание. Признаю ошибку что нужно было добавить это задние в блокаторы 8430, а не зависимости - что-то я начудил.

Согласен что нужно было явно указать 8430 в первом сообщении из-за проведённой там работы.

Постараюсь ответственней подходить к таким моментам
Comment 12 Dmitry Timoshkov 2015-11-02 17:35:04 MSK
(Ответ Dmitry Timoshkov на комментарий9)
> Дальнейшее исследование свелось к экспериментам и написанию нового теста
> для IEnumSTATSTG::Next(). В процессе исследованиея одно из предположений
> подтвердилось: IEnumSTATSTG::Next() в случае завершения перечесления всех
> элементов должен не просто вернуть S_FALSE, но и полностью обнулить структуру
> данных, переданную приложением. Как только было добавлено обнуление структуры
> при возврате S_FALSE, 1С сразу же смогла полностью выполнить и завершить
> объединение конфигураций. Но, по завершении объединения 1С начала сообщать
> об ошибке открытия документа. Дальнейшее исследование показало, что это
> та же самая проблема, что и в задаче 10868, и приложение патчей, решающих
> проблему в той задаче, позволяют избежать сообщений об ошибке и по окончании
> объединения конфигураций.
> 
> Патчи с тестами и исправлением для IEnumSTATSTG::Next() отправлены в
> wine-patches.

Винсент попросил немного переделать патчи. Новая версия патчей отправлена
в wine-patches.
Comment 13 Dmitry Timoshkov 2015-11-03 13:29:48 MSK
(Ответ Dmitry Timoshkov на комментарий12)
> > Дальнейшее исследование свелось к экспериментам и написанию нового теста
> > для IEnumSTATSTG::Next(). В процессе исследованиея одно из предположений
> > подтвердилось: IEnumSTATSTG::Next() в случае завершения перечесления всех
> > элементов должен не просто вернуть S_FALSE, но и полностью обнулить структуру
> > данных, переданную приложением. Как только было добавлено обнуление структуры
> > при возврате S_FALSE, 1С сразу же смогла полностью выполнить и завершить
> > объединение конфигураций. Но, по завершении объединения 1С начала сообщать
> > об ошибке открытия документа. Дальнейшее исследование показало, что это
> > та же самая проблема, что и в задаче 10868, и приложение патчей, решающих
> > проблему в той задаче, позволяют избежать сообщений об ошибке и по окончании
> > объединения конфигураций.
> > 
> > Патчи с тестами и исправлением для IEnumSTATSTG::Next() отправлены в
> > wine-patches.
> 
> Винсент попросил немного переделать патчи. Новая версия патчей отправлена
> в wine-patches.

3 из 4 патчей приняты, к последнему патчу у Винсента снова появилсь замечания.
После небольших изменений последний патч отправлен в wine-patches.
Comment 14 Dmitry Timoshkov 2015-11-05 09:33:05 MSK
(Ответ Dmitry Timoshkov на комментарий13)
> > > Дальнейшее исследование свелось к экспериментам и написанию нового теста
> > > для IEnumSTATSTG::Next(). В процессе исследованиея одно из предположений
> > > подтвердилось: IEnumSTATSTG::Next() в случае завершения перечесления всех
> > > элементов должен не просто вернуть S_FALSE, но и полностью обнулить структуру
> > > данных, переданную приложением. Как только было добавлено обнуление структуры
> > > при возврате S_FALSE, 1С сразу же смогла полностью выполнить и завершить
> > > объединение конфигураций. Но, по завершении объединения 1С начала сообщать
> > > об ошибке открытия документа. Дальнейшее исследование показало, что это
> > > та же самая проблема, что и в задаче 10868, и приложение патчей, решающих
> > > проблему в той задаче, позволяют избежать сообщений об ошибке и по окончании
> > > объединения конфигураций.
> > > 
> > > Патчи с тестами и исправлением для IEnumSTATSTG::Next() отправлены в
> > > wine-patches.
> > 
> > Винсент попросил немного переделать патчи. Новая версия патчей отправлена
> > в wine-patches.
> 
> 3 из 4 патчей приняты, к последнему патчу у Винсента снова появилсь
> замечания.
> После небольших изменений последний патч отправлен в wine-patches.

Все патчи приняты, портированы и отправлены для принятия в ветку eter-2.1.
Константин, пожалуйста протестируйте исправление.
Comment 15 Dmitry Timoshkov 2015-11-05 09:35:43 MSK
Отмечаю как решенную. Константин, закройте задачу как подтвердите исправление.
Comment 16 Konstantin Artyushkin 2015-11-05 13:55:08 MSK
Проверил:

  wine-etersoft-2.1.3-alt31

Проблема больше не воспроизводиться.

Закрываю.