Summary: | 1c77 - ошибка при объединении конфигураций | wine 2.1.3 | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Konstantin Artyushkin <akv> |
Component: | Общее | Assignee: | Konstantin Artyushkin <akv> |
Status: | CLOSED FIXED | QA Contact: | Konstantin Artyushkin <akv> |
Severity: | minor | ||
Priority: | P4 | CC: | baraka, dtimoshkov, dtr |
Version: | unspecified | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Linux | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 8430, 9358 |
Description
Konstantin Artyushkin
2015-10-01 17:16:12 MSK
Бутылка swine 2.1 bugs/10837 В 1С и конфигуратор можно заходить под любым пользователем без пароля. В данном случае воспроизводилось под пользователем Фёдоров. !!!!! Забыл !!!!! Проблема воспроизводится если в настройках объединения выбрать параметры: Приоритет Конфигурации - Загружаемая конфигурация Метод Объединения - Замещать объекты Всего 4 варианта - воспроизвести получилось только в 1-м (Ответ Konstantin Artyushkin на комментарий0)
> Запустить c:/Program Files/1Cv77/BIN/1cv7l.exe
>
> Выбрать "Информационная база #2" и запустить в режиме конфигуратора.
> Меню -> Конфигурация -> открыть конфигурацию.
> Меню -> Конфигурация -> Объединить конфигурации - выбираю по адресу
> С:\\update\1cv7.md
>
> Внизу появится лог процесса, ждём таких результатов:
>
> -Режим замещения ведущих объектов
> -Загружаемая конфигурация является приоритетной
> -Замещение Объекта: "Задача"
> -Произошла ошибка в процессе объединения конфигураций
Проблема воспроизводится, но пока непонятно, что именно происходит и что
является ее источником.
(Ответ 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. С ходу выяснить источник регрессии не получилось,
продолжаю разбираться.
(Ответ 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 - это последнее, что я вижу перед созданием
окна с сообщением об ошибке. Пока это единственная теория, которую нужно
будет проверить.
(Ответ 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.
(Ответ Dmitry Timoshkov на комментарий5)
> Префикс, указанный в задаче 10868 полностью повторяет описанную выше проблему
> и в этом префиксе падение при вызове GetTextExtentPointW() воспроизводится
> со 100% вероятностью и не зависит от локали и запущена или нет еще какая-то
> программа в этом префиксе. Поэтому пришлось исследовать проблему и искать
> причины и возможное решение.
>
> Как оказалось, падение вызвано порчей памяти, при чем порча памяти происходит
> исключительно тогда, когда GetFileAttributes() возвращает ошибку для файла
> шрифта, и ошибка GetFileAttributes() вызвана тем, что файл шрифта находится
> вне используемого wine префикса, где-то в /usr/share/fonts и при этом диск
> z:, указывающий на / (и позволяющий обращаться к файлам вне префикса через
> ссылку z:->/) не существует (вернее специально удален по соображениям
> безопасности). Так как конфигурация без ссылки z:->/ используется крайне
> редко (а может вообще нигде не используется кроме W@E), то поэтому данная
> проблема не была обнаружена до сих пор.
>
> Патч, исправляющий порчу памяти, отправлен в wine-patches.
Патч принят.
(Ответ 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 и начал разбираться с причинами
неудач в тестах.
(Ответ 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 дочернего окна, так же продолжил исследование причин неудач
в тестах.
Совершенно слуйчано заметил, что данная задача блокирует задачу 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. (Ответ Dmitry Timoshkov на комментарий9)
> Совершенно слуйчано заметил, что данная задача блокирует задачу 8430. Чтение
> комментариев к задаче 8430 показало, что эта задача 10837 фактически является
> повтором задачи 8430, и Сергей Гуральник в рамках исследования задачи 8430
> уже выяснил, что использование ole32.dll из Windows XP позволяет выполнить
> объединение конфигураций в 1С без ошибок.
Константин, в чем причина создания повтров для уже существующих задач к тому
же без явного указания, что это фактический повтор? Такая практика распыляет
информацию по разным задачам и ведет к потере уже известных результатов
исследований, и как результат ведет к повторному исследованию возможно уже
исследованных проблем.
(Ответ Dmitry Timoshkov на комментарий10)
объединение конфигураций в 1С без ошибок.
>
> Константин, в чем причина создания повтров для уже существующих задач к тому
> же без явного указания, что это фактический повтор? Такая практика распыляет
> информацию по разным задачам и ведет к потере уже известных результатов
> исследований, и как результат ведет к повторному исследованию возможно уже
> исследованных проблем.
Многие бутылки и файлы из задания 8430 уже не актуальны, было решено воспроизвести и вынести в отдельное задание. Признаю ошибку что нужно было добавить это задние в блокаторы 8430, а не зависимости - что-то я начудил.
Согласен что нужно было явно указать 8430 в первом сообщении из-за проведённой там работы.
Постараюсь ответственней подходить к таким моментам
(Ответ Dmitry Timoshkov на комментарий9)
> Дальнейшее исследование свелось к экспериментам и написанию нового теста
> для IEnumSTATSTG::Next(). В процессе исследованиея одно из предположений
> подтвердилось: IEnumSTATSTG::Next() в случае завершения перечесления всех
> элементов должен не просто вернуть S_FALSE, но и полностью обнулить структуру
> данных, переданную приложением. Как только было добавлено обнуление структуры
> при возврате S_FALSE, 1С сразу же смогла полностью выполнить и завершить
> объединение конфигураций. Но, по завершении объединения 1С начала сообщать
> об ошибке открытия документа. Дальнейшее исследование показало, что это
> та же самая проблема, что и в задаче 10868, и приложение патчей, решающих
> проблему в той задаче, позволяют избежать сообщений об ошибке и по окончании
> объединения конфигураций.
>
> Патчи с тестами и исправлением для IEnumSTATSTG::Next() отправлены в
> wine-patches.
Винсент попросил немного переделать патчи. Новая версия патчей отправлена
в wine-patches.
(Ответ Dmitry Timoshkov на комментарий12)
> > Дальнейшее исследование свелось к экспериментам и написанию нового теста
> > для IEnumSTATSTG::Next(). В процессе исследованиея одно из предположений
> > подтвердилось: IEnumSTATSTG::Next() в случае завершения перечесления всех
> > элементов должен не просто вернуть S_FALSE, но и полностью обнулить структуру
> > данных, переданную приложением. Как только было добавлено обнуление структуры
> > при возврате S_FALSE, 1С сразу же смогла полностью выполнить и завершить
> > объединение конфигураций. Но, по завершении объединения 1С начала сообщать
> > об ошибке открытия документа. Дальнейшее исследование показало, что это
> > та же самая проблема, что и в задаче 10868, и приложение патчей, решающих
> > проблему в той задаче, позволяют избежать сообщений об ошибке и по окончании
> > объединения конфигураций.
> >
> > Патчи с тестами и исправлением для IEnumSTATSTG::Next() отправлены в
> > wine-patches.
>
> Винсент попросил немного переделать патчи. Новая версия патчей отправлена
> в wine-patches.
3 из 4 патчей приняты, к последнему патчу у Винсента снова появилсь замечания.
После небольших изменений последний патч отправлен в wine-patches.
(Ответ 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.
Константин, пожалуйста протестируйте исправление.
Отмечаю как решенную. Константин, закройте задачу как подтвердите исправление. Проверил: wine-etersoft-2.1.3-alt31 Проблема больше не воспроизводиться. Закрываю. |