it-swarm.dev

Rozszerzenia Git: błąd Win32 487: Nie można zarezerwować miejsca na stercie cygwina, błąd Win32 0

Git Extensions: Wszystko działało dobrze do wczoraj.

Ale nagle pojawia się ten błąd, gdy próbuję pobrać niektóre repozytoria za pomocą 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

Dzieje się tak dla wszystkich repozytoriów, które sklonowałem. Ale moja git bash działa dobrze. Nie mam pojęcia, co się dzieje. Masz pomysł, dlaczego tak się dzieje?

339
Uchia Itachi

Cygwin korzysta z trwałych sekcji pamięci współdzielonej, które mogą czasami zostać uszkodzone. Objawem tego jest to, że niektóre programy Cygwin zaczynają zawodzić, ale inne aplikacje pozostają bez zmian. Ponieważ te sekcje pamięci współużytkowanej są trwałe, często konieczne jest ponowne uruchomienie system, aby je usunąć, zanim problem zostanie rozwiązany.

230
Greg Hewgill

Miałem ten sam problem. Znalazłem rozwiązanie tutaj http://jakob.engbloms.se/archives/14

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

Dla mnie rozwiązanie było nieco inne. To było

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

Przed zmianą bazy bibliotek DLL upewnij się, że nie jest on używany:

tasklist /m msys-1.0.dll

I wykonaj kopię zapasową:

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

Jeśli polecenie rebase nie powiedzie się z czymś takim jak:

ReBaseImage (msys-1.0.dll) nie powiódł się z ostatnim błędem = 6

Musisz wykonać następujące czynności w kolejności:

  1. Skopiuj dll do innego katalogu
  2. Ponownie uruchom kopię za pomocą powyższych poleceń
  3. Zastąp oryginalny plik dll kopią.

Jeśli wystąpi jakiś problem, uruchom komendy jako Administrator

377
zainengineer

tl; dr: Install 64-bit Git dla Windows 2 .


Szczegóły techniczne

      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

Ten objaw sam w sobie nie ma nic wspólnego z bazami obrazów plików wykonywalnych, uszkodzonymi sekcjami pamięci wspólnej Cygwin, sprzecznymi wersjami bibliotek DLL itp.

To kod Cygwina, który nie przydziela ok. 5 MB dużej pamięci dla swojego sterty pod tym stałym adresem 0x68570000, podczas gdy widocznie dostępna była tylko dziura o wielkości ok. 2,5 MB. Odpowiedni kod można zobaczyć w msysgit source .


Dlaczego ta część przestrzeni adresowej nie jest wolna?

Może być wiele przyczyn. W moim przypadku były to inne moduły załadowane pod adres powodujący konflikt:

Process modules in Process Explorer

Ostatni adres powinien wynosić około 0x68570000 + 5 MB = 0x68C50000, ale niektóre biblioteki DLL związane z WOW64 są ładowane od 0x68810000 w górę, co blokuje przydział.

Ilekroć istnieje wspólna biblioteka DLL, system Windows ogólnie próbuje załadować ją pod tym samym adresem wirtualnym we wszystkich procesach, aby zaoszczędzić trochę przetwarzania relokacji. To tylko pech, że te elementy systemu zostały w jakiś sposób załadowane na adres powodujący konflikt tym razem.


Dlaczego w twoim Git jest Cygwin?

Ponieważ Git to bogaty pakiet składający się z kilku poleceń niskiego poziomu i wielu pomocnych narzędzi, i głównie opracowany na systemach uniksopodobnych. Aby móc go zbudować i uruchomić bez masywnego przepisywania, potrzebuje przynajmniej częściowego środowiska uniksowego.

Aby to osiągnąć, ludzie wymyślili MinGW i MSYS - minimalny zestaw narzędzi do budowania programów w systemie Windows w sposób podobny do Uniksa. MSYS zawiera także bibliotekę współdzieloną, to msys-1.0.dll, Która pomaga w niektórych problemach ze zgodnością między dwiema platformami w czasie wykonywania. Wiele z nich zostało zaczerpniętych od Cygwina, ponieważ ktoś już musiał rozwiązać te same problemy.

Więc to nie Cygwin, to środowisko uruchomieniowe MinGW DLL, co tutaj zachowuje się dziwnie.

W Cygwin ten kod faktycznie się bardzo zmienił od czasu, co jest w MSYS 1.0 - ostatni komunikat zatwierdzenia dla tego plik mówi „Importuj Cygwin 1.3.4”, który pochodzi z 2001 roku!

Zarówno obecny Cygwin , jak i nowa wersja MSYS - MSYS2 - mają już inną logikę, która, miejmy nadzieję, jest bardziej niezawodna. To tylko stare wersje Git dla Windows, które zostały zbudowane przy użyciu starego, zepsutego systemu MSYS.


Czyste rozwiązania:

  • Zainstaluj Git dla Windows 2 - jest on zbudowany z nowym, odpowiednio utrzymywanym MSYS2 , a także ma wiele nowych funkcji, wiele poprawek błędów, ulepszeń bezpieczeństwa i tak dalej. Jeśli to w ogóle możliwe, zaleca się również korzystanie z wersji 64-bitowej . Ale obejście rebase jest wykonywane automatycznie za kulisami dla systemów 32-bitowych, więc szanse na wystąpienie problemu powinny być również niższe.
  • Ponowne uruchomienie komputera w celu wyczyszczenia przestrzeni adresowej (ładowanie tych modułów pod innym losowym adresem) może działać, ale tak naprawdę wystarczy uaktualnić do Git dla systemu Windows 2, aby uzyskać poprawki zabezpieczeń, jeśli nic więcej.

Hacky rozwiązania:

  • Zmiana PATH może czasami działać, ponieważ mogą istnieć różne wersje msys-1.0.dll W różnych wersjach Git lub innych aplikacji opartych na MSYS, które mogą używać innego adresu, innego rozmiaru tej sterty itp.
  • Ponowne uruchomienie msys-1.0.dll Może być stratą czasu, ponieważ 1) będąc biblioteką DLL, ma już informacje o relokacji i 2) „w żadnej wersji systemu operacyjnego Windows nie ma gwarancji, że (...) DLL zawsze ładuje się w tej samej przestrzeni adresowej ”( źródło ). Jedynym sposobem, w jaki może to pomóc, jest to, że sam msys-1.0.dll Ładuje się pod adres powodujący konflikt, który następnie próbuje użyć. Najwyraźniej czasami tak jest, ponieważ tak właśnie robią faceci Git dla Windows na systemy 32-bitowe .
  • Biorąc pod uwagę powyższe ustalenia, pierwotnie binarnie załatałem plik binarny msys-1.0.dll, Aby użyć innej wartości dla _cygheap_start I to natychmiast rozwiązało problem.
135
Yirkha

Bardzo prosta wersja rozwiązania bazowego:

Przejdź do folderu, w którym zainstalowany jest git, takiego jak:

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

Przytrzymując klawisz Shift i klikając prawym przyciskiem myszy w folderze, powinieneś być w stanie otworzyć z tego polecenia Monituj jako administrator (dzięki https://stackoverflow.com/users/355389/darren-lewis komentarz),

Następnie uruchomić:

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

Naprawiłem to, gdy podejście restartu nie działało.

Mam nadzieję, że to pomoże.

32
Tisch

Po aktualizacji do git1.8.5.2 zobaczyłem ten sam komunikat o błędzie:

Po prostu wyszukaj wszystkie msys-1.0.dll na Twoim C:\ drive, i spraw, by ten używany przez Git był na pierwszym miejscu.

Na przykład w moim przypadku po prostu zmieniłem kolejność:

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

Tworząc ścieżkę Git C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\ zajmij pierwsze miejsce w moim %PATH% komunikat o błędzie zniknął.

Nie ma potrzeby ponownego uruchamiania ani nawet zmiany sesji DOS.
Kiedyś %PATH% jest aktualizowany w tej sesji DOS, po prostu działają polecenia git.


Zauważ, że Carmbrester i Sixto Saez oba raporty poniżej (w komentarzach) muszą zrestartować się w aby naprawić problem.
Uwaga: po pierwsze, również usuń wszelkie msys-1.0.dll, jak jeden w %LOCALAPPDATA%

12
VonC

Jeśli ponowne uruchomienie nie rozwiąże problemu (jak sugeruje odpowiedź Grega Hegwilla), sprawdź PATH pod kątem sprzecznych instalacji msys-1.0.dll (i ewentualnie innych powiązanych bibliotek DLL).

W mojej szczególnej sytuacji instalacja msys przez MinGW ma kopię tego DLL w swoim katalogu bin (<MinGW_Install_Path>\msys\1.0\bin) i została wymieniona w ŚCIEŻCE. Katalog Git cmd był wymieniony w ŚCIEŻCE, ale jego bin nie był. (Wersja msys-1.0.dll Gita znajduje się w katalogu bin. Najwyraźniej domyślna instalacja MSys-Git nie dodaje jej bin do ŚCIEŻKI.)

Tymczasową poprawką było dodanie katalogu Git bin do PATH, tak aby pojawiał się przed ścieżkami MinGW. (Trwała poprawka prawdopodobnie będzie polegać na rozwiązaniu konfliktów ścieżek między msys MinGW a Git i/lub usunięciem zduplikowanych instalacji msys.)

7
RobertB

Chcę tylko podzielić się z nami swoim doświadczeniem. Ten sam problem napotkałem podczas kompilacji krzyżowej dla platformy MTK na 64-bitowym komputerze z systemem Windows. MinGW i MSYS są zaangażowane w proces budowy i ten problem pojawił się. Rozwiązałem to, zmieniając msys-1.0.dll plik. Ani rebase.exe ani restart systemu nie działał dla mnie.

Ponieważ na moim komputerze nie ma zainstalowanego programu rebase.exe. Zainstalowałem cygwin64 i użyłem rebase.exe wewnątrz:

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

Mimo że ponowne bazowanie wydawało się udane, błąd pozostał. Następnie uruchomiłem rebase wewnątrz terminala Cygwin64 i dostałem błąd:

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

Później spróbowałem kilka adresów, ale żaden z nich nie działał. Skończyło się na zmianie msys-1.0.dll plik i to rozwiązało problem.

2
radiohead

Wpadłem na to dzisiaj. Kierowany odpowiedzią Grega Hewgilla, spojrzałem na uruchomione procesy w moim systemie, aby sprawdzić, czy coś się „utknęło” lub czy inni użytkownicy byli zalogowani na maszynie, robiąc cokolwiek z git. Następnie uruchomiłem cygwin (zainstalowany osobno) na tym konkretnym komputerze. Uruchomił się dobrze. Zamknąłem go, a następnie ponownie wypróbowałem rozszerzenia Git (próbowałem operacji ściągania) i zadziałało. Nie jestem pewien, czy uruchomienie cygwina wyczyściło coś, co zostało udostępnione, ale po raz pierwszy napotkałem ten błąd i wydawało mi się, że to naprawiło.

1
P_O

Ten błąd zdarza się bardzo rzadko na moim komputerze z systemem Windows. Skończyło się na ponownym uruchomieniu komputera i błąd zniknął.

1
IgorGanapolsky

Miałem ten sam problem po awarii i aktualizacji systemu Windows 8.0 na msys git 1.9. Nie znalazłem żadnego msys/git na mojej ścieżce, więc właśnie dodałem go do ustawień envinroment lokalnych użytkowników Windows. Działa bez ponownego uruchamiania.

Zasadniczo, podobnie jak RobertB, ale nie miałem żadnych git/msys na mojej ścieżce.

Btw:

  1. Próbowałem użyć rebase -b blablabla msys.dll, ale miałem błąd „ReBaseImage (msys-1.0.dll) nie powiodło się z ostatnim błędem = 6”

  2. jeśli potrzebujesz tego szybko i nie masz czasu na debugowanie, zauważyłem, że „Git Bash.vbs” w katalogu Git pomyślnie uruchamia bash Shell.

1
Koshmaar

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

0

Usuwanie starej wersji% USERPROFILE%\AppData\Local\SourceTree\app-x.x.x działało dla mnie. Nie jestem pewien, jak to było połączone z git z wiersza poleceń ...

0
barbalion

Napotkałem ten problem z budynkiem LPCXpresso. Jeśli masz C:\MinGW\bin w ŚCIEŻCE. jakoś musiałem go usunąć, aby pozbyć się tego problemu, ponieważ niektóre inne oparte na MinGW też

0
Prashanjit Ghosh

Aby rozwiązać ten problem, po prostu pozwalam Tortoise Git zainstalować swoją aktualizację.

0
Jace Browning