Maximus5 / ConEmu

Customizable Windows terminal with tabs, splits, quake-style, hotkeys and more
https://conemu.github.io/
BSD 3-Clause "New" or "Revised" License
8.57k stars 573 forks source link

Баг сброса настроек, перманентный crash процесса после сброса. #2492

Open OSPanel opened 1 year ago

OSPanel commented 1 year ago

Пробую портативную версию ConEmu, чистую свежераспакованную. Один раз после распаковки запустил, выбрал место хранения настроек C:\ConEmu\ConEmu\ConEmu.xml и язык, всё.

Версия: ConEmu 220807 x64, но проблема и на многих других версиях ConEmu и уже очень давно. Система: Windows 10 Pro 22H2 x64

В чём суть - ConEmu не может запуститься из другого процесса, процесс ConEmu крашится при каждом вызове. Я вызываю ConEmu из программы на Delphi простейшим способом: ShellExecute( GetDesktopWindow( ), '', 'C:\ConEmu\ConEmu.exe -Single -Dir "моя_папка"', nil, nil, SW_SHOWNORMAL )

Сообщение в лог Windows:

Имя сбойного приложения: ConEmu64.exe, версия: 22.8.7.0, метка времени: 0x62f03300
Имя сбойного модуля: ntdll.dll, версия: 10.0.19041.1741, метка времени: 0x77755782
Код исключения: 0xc0000374

Скорее всего эта проблема имеет отношение и к багу 2330, т.к. ошибка 0xc0000374 идентична.

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

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

ConEmu bug1

После сброса и сохранения настроек имеем размер файла с настройками равным 36 КБ. Программа при этом не запускается из другого процесса, крашится.

ConEmu bug1

  1. Далее запускаем программу снова, и хоть мы уже всё настроили ранее вылазит какое-то чудо-окно и снова просит заново внести некоторые настройки!

ConEmu bug1

Ок сохраняем настройки и запускаем программу. Она работает, но по прежнему не запускается из другого процесса. Размер файла с настройками по прежнему 36 КБ.

ConEmu bug1

  1. Но стоит нам опять открыть настройки и ОПЯТЬ нажать на кнопку Сохранить, то размер файла настроек чудным образом увеличивается, а работа самой программы налаживается и она спокойно запускается из других процессов и больше не падает.

ConEmu bug1

Размер файла с настройками уже 44 КБ, хотя мы ничего не меняли и не настраивали после сброса и сохранения настроек.

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

ВРЕМЕННОЕ РЕШЕНИЕ

Пока этот баг не исправлен проблема с 0xc0000374 решается вышеописанным способом, т.е. ещё раз открыть настройки и ещё раз их сохранить, можно даже ничего не трогая.

OSPanel commented 1 year ago

Копнул глубже, сравнил конфиги. Как оказалось, программа падает из-за отсутствия тасков в xml файле. Почему падает, не понятно, т.к. при вызове программы из другого процесса никакие таски не вызываются. Вместо вот этого куска конфигурации:

        <key name="Tasks" modified="2022-12-24 10:24:25" build="220807">
                <value name="Count" type="long" data="14"/>
                <key name="Task1" modified="2022-12-24 10:24:25" build="220807">
                    <value name="Name" type="string" data="{Shells::cmd}"/>
                    <value name="Flags" type="dword" data="00000002"/>
                    <value name="Hotkey" type="dword" data="00000000"/>
                    <value name="GuiArgs" type="string" data=""/>
                    <value name="Active" type="long" data="0"/>
                    <value name="Count" type="long" data="1"/>
                    <value name="Cmd1" type="string" data='cmd.exe /k "%ConEmuBaseDir%\CmdInit.cmd"'/>
                </key>
                <key name="Task2" modified="2022-12-24 10:24:25" build="220807">
                    <value name="Name" type="string" data="{Shells::cmd (Admin)}"/>
                    <value name="Flags" type="dword" data="00000004"/>
                    <value name="Hotkey" type="dword" data="00000000"/>
                    <value name="GuiArgs" type="string" data=""/>
                    <value name="Active" type="long" data="0"/>
                    <value name="Count" type="long" data="1"/>
                    <value name="Cmd1" type="string" data='cmd.exe /k "%ConEmuBaseDir%\CmdInit.cmd" -new_console:a'/>
                </key>
                <key name="Task3" modified="2022-12-24 10:24:25" build="220807">
                    <value name="Name" type="string" data="{Shells::cmd-32}"/>
                    <value name="Flags" type="dword" data="00000004"/>
                    <value name="Hotkey" type="dword" data="00000000"/>
                    <value name="GuiArgs" type="string" data=""/>
                    <value name="Active" type="long" data="0"/>
                    <value name="Count" type="long" data="1"/>
                    <value name="Cmd1" type="string" data='"%windir%\syswow64\cmd.exe" /k "%ConEmuBaseDir%\CmdInit.cmd"'/>
                </key>
                ... и так далее ..
        </key>

записывается такой:

        <key name="Tasks" modified="2022-12-24 10:24:25" build="220807">
                <value name="Count" type="long" data="0"/>      
        </key>

и случается вылет conemu с кодом исключения: 0xc0000374.

Получается что нужно исправить 2 момента:

  1. Чтобы программа не вылетала при вызове из других процессов в случае отсутствия тасков в конфиге.
  2. Чтобы программа генерировала дефолтные таски сразу после сброса, а не аж на третьем сохранении настроек!

Самое интересное то, что в программе даже "из коробки" при первом запуске и последующих (до первого повторного сохранения настроек) идёт пустой портативный конфиг, хотя все таски в окне настроек отображаются, т.е. они как бы есть, но в конфиге их нет.