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

342

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

Но вдруг я получаю эту ошибку, когда я пытаюсь вытащить некоторые репозитории, используя 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's heap, Win32 error 0

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

Учиа Итачи
источник
5
Cygwin странный и использует постоянные разделы общей памяти. Вы пытались перезагрузить систему?
Грег Хьюгилл
@GregHewgill: не перезагружался уже несколько дней. Сделаю это прямо сейчас.
Учиа Итачи
1
@GregHewgill: все получилось. Спасибо, может быть, если вы разместите это как ответ, это будет полезно и для других.
Учиа Итачи
Просто хотел сказать, что эта ошибка не является специфической для git, и в плохие дни cygwin будет аварийно завершать работу любого исполняемого файла без видимой причины.
Менельдаль
1
OP, вы должны изменить выбранный ответ на ответ @ Yirkha, так как он решает основную причину проблемы. Это может спасти некоторые бесполезные попытки будущих читателей (как это случилось со мной).
17

Ответы:

230

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

Грег Хьюгилл
источник
В случае, если это кому-нибудь поможет, я переместил бит GitExtensions в моем PATH, чтобы он стал первым элементом, и, похоже, это решило проблему для меня. (Я поставил 2-й git / cmd - не уверен, что это было частью этого). Немного проще, чем перезагрузка или перетасовка .dll.
Jinglesthula
6
Разве нет исполняемого файла, который можно просто завершить, чтобы освободить память? Полная перезагрузка системы кажется излишним. Кроме того, ответ ниже ( stackoverflow.com/a/31970708/88409 ) объясняет, в чем проблема на самом деле, и это не имеет никакого отношения к поврежденной памяти.
Триынко
379

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

Если возникла проблема, запустите команды от имени администратора.

zainengineer
источник
1
В моем случае я rebase.exe находился в подкаталоге в / mingw, поэтому команда завершилась так: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll, и я запустил его, находясь в c: Каталог / msysgit / bin.
Роберт Ошлер
8
Я получаю эту ошибку ReBaseImage (msys-1.0.dll) не удалось с последней ошибкой = 6
TheJKFever
17
@TheJKВ любом случае вам нужно запустить его в командной строке от имени администратора, потому что он собирается изменить msys-1.0.dll. Сначала сделайте резервную копию dll, скопируйте ее в msys-1.0.dll.bak, затем выполните команду от имени администратора. Это сработало для меня.
Николаос Георгиу
1
Windows 8.1 говорит мне, что я не могу запустить этот исполняемый файл на этом компьютере, когда я пытаюсь перебазировать
Жюль GM
2
У меня нет rebase.exe на моем Win10 64 Bit Pro, но с этим справились (VS2010): «C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe» "/ REBASE: BASE = 0x50000000 msys-1.0.dll
Пол Бусманн
136

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's heap, Win32 error 0

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

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


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

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

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

Последний адрес будет около 0x68570000 + 5 МБ = 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 - в последнем сообщении о фиксации для этого файла указано «Import Cygwin 1.3.4», начиная с 2001 года!

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


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

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

Хакерские решения:

  • Изменение PATHможет иногда работать, потому что могут быть разные версии msys-1.0.dllв разных версиях Git или других MSYS-приложений, которые, возможно, используют другой адрес, разный размер этой кучи и т. Д.
  • Перебазировка msys-1.0.dllможет быть пустой тратой времени, потому что 1) будучи DLL, она уже имеет информацию о перемещении и 2) «в любой версии ОС Windows нет гарантии, что (...) DLL всегда будет загружаться в одном и том же адресном пространстве» во всяком случае ( источник ). Единственный способ, которым это может помочь, - это если msys-1.0.dllсам загружается по конфликтующему адресу, который он затем пытается использовать. По-видимому, иногда так и происходит, поскольку именно так Git для Windows делают автоматически на 32-битных системах .
  • Учитывая вышеприведенные выводы, я изначально установил msys-1.0.dllдвоичный код для двоичного кода, чтобы использовать другое значение, _cygheap_startи это немедленно решило проблему.
Yirkha
источник
1
Спасибо за ваш любопытный комментарий! Оказывается, это было исправлено так или иначе в течение достаточно долгого времени, и правильное решение, кажется, состоит в том, чтобы использовать Git для Windows 2, построенный на MSYS2 (и, следовательно, более поздний код Cygwin).
Йирха
2
Спасибо, приятно знать. Я использую версию в комплекте с Git-расширениями, что бы это ни было. Перезагрузка исправила это, так что я буду игнорировать это, пока обновление не уйдет ко мне. :-)
Тим Абель
3
Идеальный, хорошо документированный ответ! И правильное постоянное решение проблемы вместо принятого в настоящее время ответа.
Сорен Бойзен
2
Немного подробнее о проблеме - github.com/git-for-windows/git/wiki/32-bit-issues
Кунал,
1
х64 у меня работает windows для windows и cmder. Спасибо! Это сводило меня с ума, особенно работа с cmder. Я в основном скопировал папку Git x64 в cmder/vendor/git-for-windowsкаталог и переименовал старую папку в git-for-windows-x86. Если вы откроете cmder/vendor/git-for-windows, вы увидите папку mingw32, которая является вашей подсказкой, которую вы используете 32bit. В x64 Git вы увидите папку mingw64.
17
32

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

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

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

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

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

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

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

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

Тиш
источник
1
Работал на меня. Просто убедитесь, что вы запускаете командную строку от имени администратора.
Даррен Льюис
Это также сработало для меня, как примечание, я не знаю, как вы могли бы сдвигать правой кнопкой мыши и загружать cmd.exe в качестве администратора, поэтому я запустил cmd.exe правой кнопкой мыши с самого начала, выберите start as admin, а затем cd в каталог, затем запустите команду. Это сработало!
edencorbin
13

Я видел то же сообщение об ошибке после обновления до 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 и Sixto Saez оба сообщают ниже (в комментариях) о необходимости перезагрузки , чтобы решить проблему.
Примечание: во-первых, также удаляя любой msys-1.0.dll, как один в%LOCALAPPDATA%

VonC
источник
1
У меня не было msys-1.0.dll где-либо еще на моем пути, но похоже, что вы были правы в этом - перемещение git-части моего пути выше в списке действительно решило проблему для меня. Спасибо вам за это! - так устал от перезагрузки, чтобы исправить.
carmbrester
1
Мои "лишние" файлы msys-1.0.DLL находятся в C: \ Users \ ваш логин \ AppData \ Local из другого приложения. Удаление этого приложения и перезагрузка устранили проблему для меня
Sixto Saez
@SixtoSaez Интересно. Я отредактировал ответ, чтобы сделать шаг перезагрузки более заметным.
VonC
вероятно, те, кому также требовалась перезагрузка, нуждались именно в этом (иная проблема, чем неправильная загрузка DLL)
Джордж Бирбилис
7

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

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

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

RobertB
источник
Перезагрузка не исправила это для меня! На пути действительно были дублированные записи. Ткс много.
Реджинальдо Сантос
2

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

Поскольку на моем компьютере не установлено rebase.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файл, и это решило проблему.

Radiohead
источник
1

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

P_O
источник
1

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

По сути, похоже на RobertB, но на моем пути не было никаких мерзавцев.

Btw:

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

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

Koshmaar
источник
Та же ситуация для меня. Перебазировать как админа не удалось. Добавил c:\Program Files (x86)\Git\binк пути и теперь я золотой.
Джон Кроуэлл
1

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

IgorGanapolsky
источник
0

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

Прашанджит Гош
источник
0

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

Джейс Браунинг
источник
0

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

себахаттин катал
источник
0

У меня сработало удаление старой версии% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx. Не уверен, как это было связано с Git командной строки ...

barbalion
источник