Page 1 of 1

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Mon 28 May, 2018 09:25
by scarshock
Суть проблемы в следующем: если Git генерирует вывода больше чем на одну страницу, есть некоторая вероятность, что Git повиснет. Сам Far не виснет, поэтому приходится прибивать дочерние процессы Git с помощью менеджера процессов. "Повиснет" означает, что выйти из многостраничной выдачи не предоставляется возможным, равно как и завершить сам Git с помощью Ctrl-C/Break. Постраничный вывод Git с помощью пейджеров отключён (т.е. команды типа git status, git add, git commit просто пишут в вывод без ожидания пользователя продолжить или прервать выдачу). Причём, судя по всему, такое поведение наблюдается только тогда, когда Git выдал весь результат, но по каким-то причинам виснет в самом конце. И, если прибить дочерний процесс Git, вероятность зависания при повторном запуске Git из-под того же экземпляра Far будет стремиться к единице.

Диаграмма процессов, примерно такова:
far.exe \-- git.exe (родительский процесс, не виснет) \-- git.exe (дочерний процесс, его нужно снять, чтобы родительский процесс "отпустило")
Думал, что эта проблема решается просто установкой по крайней мере версии Far из 2018, но ошибался. Проблема проявляется только при использовании связки [м.б. ConEmu+]Far+Git, но не Cmd+Git, или Cygwin Bash+Git.

Конфигурация:

- Windows 7 Ultimate 64
- Far Manager 3.0 build 5200 x86 (воспроизводилось и в более старых версиях)
- git version 2.13.3.windows.1 (возспроизводилось и в более старых версиях)

Где притаилась ошибка? Спасибо.

EDIT 1: Запуск `far -p -m` не устраняет проблему.

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Mon 28 May, 2018 11:32
by DrKnS
scarshock wrote: Mon 28 May, 2018 09:25Проблема проявляется только при использовании связки [м.б. ConEmu+]Far+Git
Для начала убедитесь, что проблема не в квадратных скобках.

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Mon 28 May, 2018 12:23
by scarshock
DrKnS wrote: Mon 28 May, 2018 11:32 Для начала убедитесь, что проблема не в квадратных скобках.
Забыл убрать перед отправкой. ConEmu отношения к проблеме не имеет никакого.

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Mon 28 May, 2018 21:08
by DrKnS
Позапускал git --no-pager log многократно, повторить не удалось.

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Tue 29 May, 2018 19:41
by scarshock
А можно как-то просто и быстро проанализировать такой процесс? Допустим, у меня прямо вот сейчас висит дочерний git: я могу его каким-либо образом проинспектировать на предмет, к примеру, работы с I/O? Такое ощущение, что проблема именно в нём + процесс не отжирает процессорное время вообще и как бы спит. Или, может быть, ещё можно куда-то посмотреть, чтобы сузить область поиска проблемы?

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Tue 29 May, 2018 20:16
by HaRT
scarshock wrote: Tue 29 May, 2018 19:41 просто и быстро проанализировать такой процесс?
Не знаю насчёт просто и быстро, но поскольку он с открытым кодом, то потенциально можно скачать исходники и отладочную информацию (и то, и другое в точности для той версии, которая запущена), подцепиться отладчиком и посмотреть, где висит и какая цепочка вызовов к этому привела.

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Tue 29 May, 2018 20:32
by Yegor
DrKnS wrote: Mon 28 May, 2018 21:08 git --no-pager log
Может как раз проблема в отсутствии этого аргумента?
Если без него запустить "git log" и нажать Ctrl+C, то можно наблюдать интересный эффект.

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Fri 01 Jun, 2018 18:52
by scarshock
@HaRT
Спасибо за наводку, но, стыдно сказать, с этим я вряд ли справлюсь -- у меня профиль немножко другой. Может, есть вариант со всякими мониторами типа Process Monitor. Тут, думаю, разберусь. По крайней мере, подходящий ли это инструмент. Ещё раз спасибо. :)

@Yegor
Там несколько запутаннее. По умолчанию пейджер, например, у `git status` отсутствует, что равнозначно `--no-pager` и всё-равно периодически приводит к зависанию. Но, если указать ключ `-p`, пейджер работает прекрасно, пока не попытаться выйти из него, нажав [Q], `git status` может повиснуть. Получается, что пейджер работает прекрасно сам по себе и здесь ни при чём. Как-то так.

При многостраничной выдаче виснет Git, если выполняется из-под Far

Posted: Fri 01 Jun, 2018 19:40
by scarshock
Похоже, получилось поймать виновника проблемы. Запустив Process Monitor в глаза бросились два момента:

1) Дочерний процесс висит, и два git-процесса поочерёдно логируются монитором с операцией "Process Profiling". И так -- до бесконечности. Понятия не имею, что инициирует это событие, и что оно собой представляет здесь, но, может быть, это просто результат подвисания.
2) В логах засветился MacType64. Попробовал снять его хост- и агент-процессы -- git-процессы больше не подвисают.

Я, наверно, спрошу глупость, но, помимо того, что MacType внедряется в процессы, может быть, что это какой-то конфликт Far x86 и MacType64? Напомню, что проблема проявляется исключительно в случае запуска git из Far. Если запускать git из cmd, проблема не воспроизводится. Я полагал, что чисто консольные приложения MacType-ом не перехватываются никогда. Раздел [Exclude] из UserParams.ini, по всей видимости, тоже не работает. Попробую ещё обновить сам MacType.

Спасибо всем за дискуссию!