Estensioni Git: errore Win32 487: impossibile riservare spazio per l'heap di cygwin, errore Win32 0


342

Estensioni Git: tutto funzionava bene fino a ieri.

Ma improvvisamente ricevo questo errore quando provo ad estrarre alcuni repository usando 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

Sta succedendo per tutti i repository che ho clonato. Ma, il mio git bash funziona bene. Non ho idea di cosa stia succedendo. Qualche idea sul perché questo stia accadendo?


5
Cygwin è strano e utilizza sezioni di memoria condivisa persistenti. Hai provato a riavviare il sistema?
Greg Hewgill,

@GregHewgill: non si riavvia da alcuni giorni. Lo farà subito.
Uchia Itachi,

1
@GregHewgill: ha funzionato. Grazie, forse se lo pubblichi come risposta, sarà utile anche per gli altri.
Uchia Itachi,

Volevo solo dire che questo bug non è specifico di Git e nei giorni cattivi Cygwin andrà in crash su qualsiasi eseguibile allo stesso modo senza una ragione apparente.
meneldal

1
OP, dovresti cambiare la risposta selezionata nella risposta di @ Yirkha, poiché quella risolve la causa principale del problema. Potrebbe salvare alcuni tentativi inutili su futuri lettori (come è successo a me).

Risposte:


230

Cygwin utilizza sezioni persistenti di memoria condivisa, che a volte possono essere danneggiate. Il sintomo di ciò è che alcuni programmi Cygwin iniziano a fallire, ma altre applicazioni non sono interessate. Poiché queste sezioni di memoria condivisa sono persistenti, spesso è necessario riavviare il sistema per eliminarle prima che il problema possa essere risolto.


Nel caso in cui aiuti qualcuno, ho spostato il bit GitExtensions nel mio PERCORSO per essere il primo elemento e sembra aver risolto il problema per me. (Ho messo git / cmd stesso 2 ° - non sono sicuro che fosse parte di esso). Un po 'più semplice di un riavvio o di un shdling di DLL.
jinglesthula,

6
Non esiste un eseguibile che può essere semplicemente terminato per liberare memoria? Un riavvio completo del sistema sembra eccessivo. Inoltre, una risposta di seguito ( stackoverflow.com/a/31970708/88409 ) spiega qual è il problema e non ha nulla a che fare con la memoria danneggiata.
Triynko,

379

Ho avuto lo stesso problema. Ho trovato la soluzione qui http://jakob.engbloms.se/archives/1403

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

Per me la soluzione era leggermente diversa. Era

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

Prima di rebase dlls, è necessario assicurarsi che non sia in uso:

tasklist /m msys-1.0.dll

E fai un backup:

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

Se il comando rebase fallisce con qualcosa di simile:

ReBaseImage (msys-1.0.dll) non riuscito con l'ultimo errore = 6

Sarà necessario eseguire le seguenti operazioni in ordine:

  1. Copia la dll in un'altra directory
  2. Rebase la copia utilizzando i comandi sopra
  3. Sostituisci la dll originale con la copia.

In caso di problemi, eseguire i comandi come amministratore


1
Nel mio caso, rebase.exe era nella sottodirectory in / mingw, quindi il comando è finito: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll e l'ho eseguito mentre si trovava nella cartella c: / msysgit / bin directory.
Robert Oschler,

8
Ho riscontrato questo errore ReBaseImage (msys-1.0.dll) non riuscito con l'ultimo errore = 6
TheJKFever

17
@TheJKFever è necessario eseguirlo nel prompt dei comandi come amministratore, poiché modificherà msys-1.0.dll. Effettuare prima un backup della dll, copiarlo in msys-1.0.dll.bak, quindi eseguire il comando come amministratore. Ha funzionato per me.
Nikolaos Georgiou,

1
Windows 8.1 mi dice che non posso eseguire questo eseguibile su questo PC quando provo a rebase
Jules GM

2
Non ho rebase.exe sul mio Win10 64 Bit Pro, ma chiamare il seguente ha fatto il trucco (VS2010): "C: \ Programmi (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe "/ REBASE: BASE = 0x50000000 msys-1.0.dll
Paul Bußmann,

136

tl; dr: installa Git a 64 bit per Windows 2 .


Dettagli tecnici

      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

Questo sintomo di per sé non ha nulla a che fare con basi di immagini di eseguibili, sezioni di memoria condivisa di Cygwin danneggiate, versioni in conflitto di DLL ecc.

È il codice Cygwin che non riesce a allocare un grosso pezzo di memoria di ~ 5 MB per il suo heap a questo indirizzo fisso 0x68570000, mentre apparentemente era disponibile solo un buco di ~ 2,5 MB. Il codice rilevante può essere visto nella sorgente msysgit .


Perché quella parte dello spazio degli indirizzi non è libera?

Ci possono essere molte ragioni. Nel mio caso c'erano altri moduli caricati su un indirizzo in conflitto:

Moduli di processo in Process explorer

L'ultimo indirizzo sarebbe circa 0x68570000 + 5 MB = 0x68C50000, ma ci sono queste DLL relative a WOW64 caricate da 0x68810000 in poi, che bloccano l'allocazione.

Ogni volta che è presente una DLL condivisa, Windows in generale tenta di caricarla nello stesso indirizzo virtuale in tutti i processi per salvare l'elaborazione del trasferimento. È solo una sfortuna che stavolta questi componenti di sistema siano stati caricati in qualche modo in un indirizzo contrastante .


Perché c'è Cygwin nel tuo Git?

Perché Git è una ricca suite composta da alcuni comandi di basso livello e molte utili utility, e per lo più sviluppata su sistemi simili a Unix. Per essere in grado di costruirlo ed eseguirlo senza una massiccia riscrittura, è necessario almeno un ambiente simile a Unix parziale.

Per riuscirci, le persone hanno inventato MinGW e MSYS, un set minimo di strumenti di build per sviluppare programmi su Windows in modo simile a Unix. MSYS contiene anche una libreria condivisa, questa msys-1.0.dll, che aiuta con alcuni dei problemi di compatibilità tra le due piattaforme durante il runtime. E molte parti sono state prese da Cygwin, perché qualcuno doveva già risolvere gli stessi problemi lì.

Quindi non è Cygwin, è la DLL di runtime di MinGW che si comporta in modo strano qui.

In Cygwin, questo codice è cambiato molto da quando è presente in MSYS 1.0 - l'ultimo messaggio di commit per quel file dice "Importa Cygwin 1.3.4", che è del 2001!

Sia l' attuale Cygwin che la nuova versione di MSYS - MSYS2 - hanno già una logica diversa, che si spera sia più solida. Sono solo vecchie versioni di Git per Windows che sono state ancora costruite usando il vecchio sistema MSYS rotto.


Soluzioni pulite:

  • Installa Git per Windows 2 - è costruito con il nuovo MSYS2 , correttamente gestito e ha anche molte nuove funzionalità, molte correzioni di bug, miglioramenti della sicurezza e così via. Se possibile, si consiglia anche di utilizzare la versione a 64 bit . Ma la soluzione alternativa di rebase viene eseguita automaticamente dietro le quinte per i sistemi a 32 bit, quindi anche le probabilità che si verifichi il problema dovrebbero essere inferiori.
  • Il semplice riavvio del computer per pulire lo spazio degli indirizzi (caricamento di questi moduli in un indirizzo casuale diverso) potrebbe funzionare, ma in realtà, basta aggiornare a Git per Windows 2 per ottenere le correzioni di sicurezza se non altro.

Soluzioni Hacky:

  • Il cambiamento a PATHvolte può funzionare perché potrebbero esserci versioni diverse msys-1.0.dllin diverse versioni di Git o altre applicazioni basate su MSYS, che forse usano indirizzi diversi, dimensioni diverse di questo heap ecc.
  • Rebasing msys-1.0.dllpotrebbe essere una perdita di tempo, perché 1) essendo una DLL, ha già informazioni di riposizionamento e 2) "in qualsiasi versione del sistema operativo Windows non vi è alcuna garanzia che una (...) DLL venga sempre caricata nello stesso spazio degli indirizzi" comunque ( fonte ). L'unico modo in cui ciò può essere d'aiuto è se lo msys-1.0.dllstesso si carica all'indirizzo in conflitto che sta tentando di utilizzare. Apparentemente a volte è così, poiché è quello che fanno i ragazzi di Git per Windows automaticamente sui sistemi a 32 bit .
  • Considerando i risultati di cui sopra, originariamente ho applicato una patch msys-1.0.dllbinaria al binario per utilizzare un valore diverso _cygheap_starte ciò ha risolto immediatamente il problema.

1
Grazie per il tuo curioso commento! Si scopre che è stato risolto in un modo o nell'altro per un po 'di tempo e la soluzione corretta sembra essere utilizzare Git per Windows 2 basato su MSYS2 (e quindi il codice Cygwin più recente).
Yirkha,

2
Grazie, buono a sapersi. Sto usando la versione in bundle con git-extensions, qualunque cosa sia. Il riavvio ha risolto il problema, quindi lo ignorerò fino a quando l'aggiornamento non mi arriva. :-)
Tim Abell,

3
Risposta perfetta e ben documentata! E una soluzione permanente adeguata al problema invece della risposta attualmente accettata.
Søren Boisen,

2
Un po 'più di dettagli sul problema - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal

1
x64 Git per Windows ha funzionato per me e cmder. Grazie! Mi sta facendo impazzire, soprattutto lavorando con cmder. Fondamentalmente ho copiato la cartella x64 Git nella cmder/vendor/git-for-windowsdirectory e ho rinominato la vecchia cartella in git-for-windows-x86. Se apri cmder/vendor/git-for-windows, vedrai una cartella mingw32, che è il tuo indizio che stai usando 32 bit. In x64 Git, vedrai una cartella mingw64.
cmeza,

32

Verison molto semplice della soluzione rebase:

Vai alla cartella in cui è installato git, come ad esempio:

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

Tenendo premuto MAIUSC e facendo clic con il tasto destro nella cartella, dovresti essere in grado di aprire un prompt dei comandi come amministratore da lì (grazie a https://stackoverflow.com/users/355389/darren-lewis per quel commento),

Quindi eseguire:

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

Questo mi ha risolto quando l'approccio di riavvio non funzionava.

Spero che sia d'aiuto.


1
Ha funzionato per me. Assicurati di eseguire il prompt dei comandi come amministratore.
Darren Lewis,

Questo ha funzionato anche per me, come nota, non so come si possa spostare il tasto destro del mouse e caricare cmd.exe come amministratore, quindi ho lanciato il tasto destro del mouse cmd.exe da start selezionare start as admin, quindi cd nella directory, quindi esegui il comando. Ha funzionato!
edencorbin,

13

Ho visto lo stesso messaggio di errore dopo l'aggiornamento a git1.8.5.2:

Basta fare una ricerca di tutti msys-1.0.dllsul tuo C:\disco e fare in modo che quello usato da Git venga prima di tutto.

Ad esempio, nel mio caso ho semplicemente cambiato l'ordine di:

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

Rendendo il percorso Git il C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\primo nel mio %PATH%, il messaggio di errore è scomparso.

Non è necessario riavviare o modificare la sessione DOS.
Una volta %PATH%aggiornato in quella sessione DOS, i comandi git funzionano e basta.


Si noti che carmbrester e Sixto Saez riportano entrambi di seguito (nei commenti) il riavvio per risolvere il problema.
Nota: in primo luogo, rimuovendo anche qualsiasi msys-1.0.dll, come uno in%LOCALAPPDATA%


1
Non avevo msys-1.0.dll da nessun'altra parte nel mio percorso, ma sembra che tu abbia fatto qualcosa lì - spostare la parte git del mio percorso più in alto nell'elenco mi ha risolto il problema. Grazie per questo! - così stanco di riavviare per risolvere.
carmbrester,

1
I miei file "extra" msys-1.0.DLL erano in C: \ Users \ login \ AppData \ Local da un'altra app. La rimozione dell'app e il riavvio hanno risolto il problema per me
Sixto Saez,

@SixtoSaez Interessante. Ho modificato la risposta per rendere più visibile il passaggio di riavvio.
VonC,

probabilmente anche quelli che avevano bisogno di un riavvio ne avevano avuto bisogno (un problema diverso dal caricamento DLL errato)
George Birbilis,

7

Se un riavvio non risolve il problema (come suggerito dalla risposta di Greg Hegwill), controlla il tuo PERCORSO per le installazioni in conflitto del msys-1.0.dll (e possibilmente di altre DLL correlate).

Nella mia situazione particolare, l'installazione di msG di MinGW ha una copia di quella DLL nella sua bindirectory ( <MinGW_Install_Path>\msys\1.0\bin), ed è stata elencata nel PERCORSO. La cmddirectory di Git era elencata nel PERCORSO, ma binnon lo era. (La versione di msys-1.0.dll di Git è nella bindirectory. Apparentemente l'installazione predefinita di MSys-Git non la aggiunge binal PERCORSO.)

Una soluzione temporanea era aggiungere la bindirectory di Git al PERCORSO in modo che appaia prima dei percorsi di MinGW. (Probabilmente una correzione più permanente comporterà l'ordinamento dei conflitti di percorso tra msys di MinGW e Git e / o la rimozione delle installazioni duplicate di msys.)


Il riavvio non ha risolto il problema per me! C'erano davvero alcune voci duplicate nel percorso. Tks molto.
Reginaldo Santos,

2

Voglio solo condividere la mia esperienza qui. Mi sono imbattuto nello stesso problema durante la compilazione incrociata per la piattaforma MTK su una macchina Windows a 64 bit. MinGW e MSYS sono coinvolti nel processo di costruzione e questo problema è emerso. L'ho risolto modificando il msys-1.0.dllfile. Né il rebase.exeriavvio del sistema ha funzionato per me.

Dal momento che non è installato rebase.exe sul mio computer. Ho installato cygwin64 e usato l' rebase.exeinterno:

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

Sebbene il rebasing abbia avuto successo, l'errore è rimasto. Quindi ho eseguito il rebasecomando all'interno del terminale Cygwin64 e ho ricevuto un errore:

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

In seguito ho provato un indirizzo di coppia ma nessuno dei due ha funzionato. Così ho finito per cambiare il msys-1.0.dllfile e ho risolto il problema.


1

Mi sono imbattuto in questo oggi. Guidato dalla risposta di Greg Hewgill, ho esaminato i processi in esecuzione sul mio sistema per vedere se qualcosa era "bloccato" o se altri utenti erano connessi al computer facendo qualcosa con git. Ho quindi lanciato Cygwin (installato separatamente) su questa particolare macchina. Si è lanciato ok. L'ho chiuso e poi ho provato di nuovo le estensioni Git (stavo provando un'operazione pull) e ha funzionato. Non sono sicuro che il lancio di Cygwin abbia cancellato qualcosa che è stato condiviso, ma questa è la prima volta che mi sono imbattuto in questo errore e questo sembrava risolverlo per me.


1

Ho avuto lo stesso problema, dopo alcuni crash e aggiornamenti di Windows 8.0, su msys git 1.9. Non ho trovato alcun msys / git nel mio percorso, quindi l'ho appena aggiunto nelle impostazioni envinroment di Windows local-user. Ha funzionato senza riavviare.

Fondamentalmente, simile a RobertB, ma non avevo alcun git / msys nel mio percorso.

btw:

  1. Ho provato a utilizzare rebase -b blablabla msys.dll, ma ho riscontrato l'errore "ReBaseImage (msys-1.0.dll) non riuscito con l'ultimo errore = 6"

  2. se hai bisogno di questo rapidamente e non hai il debug del tempo, ho notato che "Git Bash.vbs" nella directory Git avvia correttamente la shell bash.


Stessa situazione per me. Ricondizionamento come amministratore fallito. Aggiunto c:\Program Files (x86)\Git\binal percorso e ora sono d'oro.
Jon Crowell,

1

Questo errore si verifica molto raramente sul mio computer Windows. Ho finito per riavviare la macchina e l'errore è andato via.


0

Ho riscontrato questo problema con l'edificio LPCEXpresso. Se hai il C: \ MinGW \ bin nel PERCORSO. in qualche modo ho dovuto rimuoverlo per sbarazzarmi di questo problema poiché anche alcuni altri MinGW si basano


0

Per risolvere questo problema, ho semplicemente lasciato che Tortoise Git installasse il suo aggiornamento.



0

L'eliminazione della vecchia versione di% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx ha funzionato per me. Non sono sicuro di come sia stato collegato alla riga di comando git ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.