Git Расширения: ошибка Win32 487: не удалось зарезервировать место для кучи cygwin, ошибка Win32 0

Git Расширения: Все работало нормально до вчерашнего дня.

Но внезапно я получаю эту ошибку, когда пытаюсь вытащить некоторые репозитории с помощью git extensions

C:\Program Files\Git\bin\git.exe pull --progress "origin" 
Done
    0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68560000, RegionSize 0x390000, State 0x10000
C:\Program Files\Git\bin\sh.exe: *** Couldn't reserve space for cygwin heap, Win32 error 0

Это происходит для всех хранилищ, которые я клонировал. Но мой Git bash работает нормально. Я не знаю, что происходит. Любая идея о том, почему это происходит?

Ответ 1

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

Ответ 2

У меня была та же проблема. Я нашел решение здесь http://jakob.engbloms.se/archives/1403

c:\msysgit\bin>rebase.exe -b 0x50000000 msys-1.0.dll

Для меня решение было несколько иным. Это было

C:\Program Files (x86)\Git\bin>rebase.exe -b 0x50000000 msys-1.0.dll

Прежде чем перезагрузить dll, вы должны убедиться, что он не используется:

tasklist /m msys-1.0.dll

И сделать резервную копию:

copy msys-1.0.dll msys-1.0.dll.bak

Если команда rebase завершится с чем-то вроде:

Ошибка ReBaseImage (msys-1.0.dll) с последней ошибкой = 6

Вам необходимо выполнить следующие шаги:

  • Скопировать dll в другой каталог
  • Восстановите копию, используя команды выше
  • Замените исходную dll копией.

Если какая-либо проблема запускает команды как Администратор

Ответ 3

tl; dr: Установите 64-разрядный Git для Windows 2.


Технические данные

      0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x68570000, RegionSize 0x2A0000, State 0x10000
PortableGit\bin\bash.exe: *** Couldn't reserve space for cygwin heap, Win32 error 0

Этот симптом сам по себе не имеет никакого отношения к основам образа исполняемых файлов, поврежденным разделяемым разделам памяти Cygwin, конфликтующим версиям DLL и т.д.

Этот код Cygwin не может выделить большой кусок памяти размером ~ 5 МБ для его кучи на этом фиксированном адресе 0x68570000, в то время как там было доступно только отверстие размером ~ 2,5 МБ. Соответствующий код можно увидеть в msysgit source.


Почему эта часть адресного пространства не бесплатна?

Могут быть много причин. В моем случае это были некоторые другие модули, загруженные с конфликтующим адресом:

Процессные модули в Process explorer

Последний адрес будет около 0x68570000 + 5 MB = 0x68C50000, но есть эти DLL-связанные с WOW64 файлы, загруженные с 0x68810000 вверх, которые блокируют выделение.

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


Почему Cygwin в вашем Git?

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

Для этого люди изобрели MinGW и MSYS - минимальный набор инструментов для создания программ для Windows в стиле Unix. MSYS также содержит общую библиотеку, это msys-1.0.dll, которая помогает с некоторыми проблемами совместимости между двумя платформами во время выполнения. И многие части этого были взяты у Cygwin, потому что кто-то уже должен был решить те же проблемы.

Так что это не Cygwin, это MinGW runtime DLL, что ведет себя странно здесь.

В Cygwin этот код действительно сильно изменился, поскольку в MSYS 1.0 - последнее сообщение фиксации для этого файла говорит: "Импортировать Cygwin 1.3.4", который с 2001 года!

Оба текущий Cygwin и новая версия MSYS - MSYS2 - уже есть разная логика, которая, надеюсь, будет более надежной. Это только старые версии Git для Windows, которые все еще были построены с использованием старой неисправной системы MSYS.


Чистые решения:

  • Установите Git для Windows 2 - он построен с новым корректно поддерживаемым MSYS2, а также имеет много новых функций, множество исправлений ошибок, улучшений безопасности и т.д. Если это вообще возможно, рекомендуется использовать 64-разрядную версию. Но обходное решение об отказе выполняется автоматически за кулисами для 32-битных систем, поэтому шансы на возникновение проблемы там также должны быть ниже.
  • Просто перезагрузка компьютера для очистки адресного пространства (загрузка этих модулей с помощью другого случайного адреса) может работать, но на самом деле просто обновите до Git для Windows 2, чтобы получить исправления безопасности, если ничего другого.

Hacky solutions:

  • Изменение PATH может иногда работать, потому что могут быть разные версии msys-1.0.dll в разных версиях Git или других приложений на основе MSYS, которые, возможно, используют другой адрес, разные размеры этой кучи и т.д.
  • Rebasing msys-1.0.dll может быть пустой тратой времени, потому что 1) является DLL, у нее уже есть информация о перемещении и 2) "в любой версии ОС Windows нет гарантии, что (...) DLL всегда будет загрузка в том же адресном пространстве" в любом случае (источник). Единственный способ, которым это может помочь, - это если сам msys-1.0.dll загружается на конфликтующий адрес, который он пытается использовать. Очевидно, что случай иногда, так как это то, что ребята Git для Windows делают автоматически на 32-битных системах.
  • Учитывая вышеприведенные выводы, я изначально бинарно исправил двоичный код msys-1.0.dll, чтобы использовать другое значение для _cygheap_start и немедленно устранил проблему.

Ответ 4

Очень простая проверка решения для восстановления:

Перейдите в папку, где установлен git, например:

C:\Program Files (x86)\Git\bin

Сохраняя сдвиг и щелкнув правой кнопкой мыши в папке, вы можете открыть там командную строку в качестве администратора (спасибо https://stackoverflow.com/users/355389/darren-lewis за этот комментарий),

Затем запустите:

rebase.exe -b 0x50000000 msys-1.0.dll

Это исправлено для меня, когда подход перезапуска не работал.

Надеюсь, это поможет.

Ответ 5

Я видел такое же сообщение об ошибке после обновления до git1.8.5.2:

Просто выполните поиск всех msys-1.0.dll на вашем диске C:\ и сделайте первый, который используется Git первым.

Например, в моем случае я просто изменил порядок:

C:\prgs\Gow\Gow-0.7.0\bin\msys-1.0.dll
C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\msys-1.0.dll

Сделав путь Git path C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\ первым в моем %PATH%, сообщение об ошибке исчезло.

Не нужно перезагружаться или даже менять сеанс DOS.
После обновления %PATH% в этом сеансе DOS команды Git работают.


Обратите внимание, что carmbrester и Sixto Saez оба отчета ниже (в комментариях) должны иметь reboot, чтобы устранить проблему.
Примечание. Во-первых, удаление любого msys-1.0.dll, как в %LOCALAPPDATA%

Ответ 6

Если перезагрузка не исправит проблему (как было предложено Greg Hegwill), проверьте свой PATH на наличие конфликтующей установки (ов) msys-1.0.dll(и, возможно, других связанных библиотек DLL).

В моей конкретной ситуации MinGW-установка msys имеет копию этой DLL в ее каталоге bin (<MinGW_Install_Path>\msys\1.0\bin), и она была указана в PATH. Каталог Git cmd был указан в PATH, но его bin не был. (Git версия msys-1.0.dll находится в каталоге bin. По-видимому, установка по умолчанию MSys- Git не добавляет ее bin в PATH.)

Временное исправление заключалось в том, чтобы добавить каталог Git bin в PATH, чтобы он появился перед путями MinGW. (Более постоянное исправление, вероятно, будет включать в себя устранение конфликтов пути между MinGW msys и Git и/или удаление дублирующих установок msys.)

Ответ 7

Я столкнулся с этим сегодня. Отвечая на вопрос Greg Hewgill, я посмотрел на запущенные процессы в моей системе, чтобы увидеть, было ли что-то "застряло" или если другие пользователи вошли в машину, делая что-либо с помощью git. Затем я запустил cygwin (установлен отдельно) на этой конкретной машине. Это началось нормально. Я закрыл его, а затем снова попробовал Git Extensions (я пытался выполнить операцию pull), и он сработал. Не уверен, что запуск cygwin очистил что-то, что было общим, но это первый раз, когда я столкнулся с этой ошибкой, и это, похоже, исправило это для меня.

Ответ 8

У меня была такая же проблема после некоторых сбоев и обновлений Windows 8.0 на msys git 1.9. Я не нашел ни одного msys/git в моем пути, поэтому я просто добавил его в настройки локального пользователя Windows. Он работал без перезагрузки.

В принципе, похоже на RobertB, но у меня не было никаких git/msys на моем пути.

Btw:

  • Я попытался использовать rebase -b blablabla msys.dll, но имел ошибку "Ошибка ReBaseImage (msys-1.0.dll) с последней ошибкой = 6"

  • если вам это нужно быстро и нет времени для отладки, я заметил, что "Git Bash.vbs" в каталоге git успешно запускает оболочку bash.

Ответ 9

Эта ошибка происходит очень редко на моей машине Windows. Я закончил тем, что перезагрузил машину, и ошибка исчезла.

Ответ 10

Я столкнулся с этой проблемой при создании LPCEXpresso. Если у вас есть C:\MinGW\bin в PATH. каким-то образом мне пришлось удалить его, чтобы избавиться от этой проблемы, так как некоторые другие MinGW, например, тоже основали

Ответ 11

Чтобы устранить эту проблему, я просто позволю Tortoise Git установить его обновление.

Ответ 12

c:\msysgit\bin > rebase.exe -b 0x50000000 msys-1.0.dll