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


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

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

C:Program FilesGitbingit.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 FilesGitbinsh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

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

14 333

14 ответов:

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

у меня была та же проблема. Я нашел решение здесь 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

вам нужно будет выполнить следующие шаги по порядку:

  1. скопируйте dll в другой каталог
  2. переустановите копию, используя команды выше
  3. замените исходную dll на копию.

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

tl; dr: Install 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's heap, Win32 error 0

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

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


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

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

Process modules in Process explorer

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

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


почему в вашем Git есть Cygwin?

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

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

так что это не Cygwin, это DLL времени выполнения MinGW, что ведет себя странно здесь.

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

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


очистить решений:

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

Hacky решения:

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

очень простая версия решения rebase:

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

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

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

запустите:

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

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

надеюсь, что это помогает.

Я видел такое же сообщение об ошибке после обновления до 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 C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\ первое место в моей %PATH%, сообщение об ошибке исчезло.

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


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

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

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

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

просто хочу поделиться своим опытом здесь. Я столкнулся с той же проблемой при кросс-компиляции для платформы MTK на 64-разрядной машине Windows. MinGW и MSYS участвуют в процессе строительства, и эта проблема возникла. Я решил это, изменив . Ни то, ни другое rebase.exe ни перезагрузка системы не сработала для меня.

так как нет перебазироваться.exe установлен на моем компьютере. Я установил cygwin64 и использовал rebase.exe внутри:

C:\cygwin64\bin\rebase.exe -b 0x50000000 msys-1.0.dll

хотя перебазирование выглядело успешно, ошибка осталась. Тогда я побежал rebase команда внутри терминала Cygwin64 и получил сообщение об ошибке:

$ rebase -b 0x50000000 msys-1.0.dll
rebase: Invalid Baseaddress 0x50000000, must be > 0x200000000

позже я попробовал пару адресов, но ни один из них не работал. Так что я в конечном итоге изменил msys-1.0.dll файл и он решил проблему.

Я столкнулся с этим сегодня. Во главе с ответом Грега Хьюгилла я посмотрел на запущенные процессы в своей системе, чтобы увидеть, если что-то "застряло" или если другие пользователи вошли в машину, делая что-либо с git. Затем я запустил cygwin (установленный отдельно) на этой конкретной машине. Он запустил ОК. Я закрыл его, а затем снова попробовал расширения Git (я пытался вытащить операцию), и это сработало. Не уверен, что запуск cygwin очистил что-то, что было разделено, но это первый раз, когда я столкнулся с этой ошибкой и это, казалось, исправить это для меня.

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

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

кстати:

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

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

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

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

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

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

удаление старой версии %USERPROFILE%\AppData\Local\SourceTree\app-x.x.x работало для меня. Не уверен, как он был подключен к командной строке git...