Git-Erweiterungen: Win32-Fehler 487: Speicherplatz für Cygwins Heap, Win32-Fehler 0, konnte nicht reserviert werden

342

Git-Erweiterungen: Bis gestern hat alles gut funktioniert.

Aber plötzlich erhalte ich diesen Fehler, wenn ich versuche, einige Repositorys mit zu ziehen 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

Es passiert für alle Repositories, die ich geklont habe. Aber mein Git Bash funktioniert gut. Ich habe keine Ahnung, was los ist. Irgendeine Idee, warum dies geschieht?

Uchia Itachi
quelle
5
Cygwin ist komisch und verwendet persistente Shared-Memory-Abschnitte. Haben Sie versucht, Ihr System neu zu starten?
Greg Hewgill
@ GregHewgill: Seit einigen Tagen nicht mehr neu gestartet. Werde es sofort tun.
Uchia Itachi
1
@ GregHewgill: Es hat geklappt. Danke, vielleicht ist es auch für andere hilfreich, wenn Sie es als Antwort posten.
Uchia Itachi
Ich wollte nur sagen, dass dieser Fehler nicht spezifisch für Git ist und dass Cygwin an schlechten Tagen ohne ersichtlichen Grund auf dieselbe Weise auf eine ausführbare Datei abstürzt.
Meneldal
1
OP, Sie sollten die ausgewählte Antwort in @ Yirkhas Antwort ändern, damit diese die Grundursache des Problems löst . Es kann einige vergebliche Versuche für zukünftige Leser ersparen (wie mir passiert ist).
Ysap

Antworten:

230

Cygwin verwendet dauerhafte Shared-Memory-Abschnitte, die gelegentlich beschädigt werden können. Das Symptom dafür ist, dass einige Cygwin-Programme anfangen zu scheitern, andere Anwendungen jedoch nicht betroffen sind. Da diese gemeinsam genutzten Speicherabschnitte dauerhaft sind, ist häufig ein Neustart des Systems erforderlich, um sie zu löschen, bevor das Problem behoben werden kann.

Greg Hewgill
quelle
Falls es jemandem hilft, habe ich das GitExtensions-Bit in meinem PATH als erstes Element verschoben und es scheint das Problem für mich gelöst zu haben. (Ich habe das git / cmd selbst auf den 2. Platz gesetzt - nicht sicher, ob das ein Teil davon war). Ein bisschen einfacher als ein Neustart oder ein DLL-Shuffling.
Jinglesthula
6
Gibt es nicht eine ausführbare Datei, die einfach beendet werden kann, um den Speicher freizugeben? Ein vollständiger Neustart des Systems scheint übertrieben. Eine Antwort unten ( stackoverflow.com/a/31970708/88409 ) erklärt auch, was das Problem wirklich ist, und es hat nichts mit beschädigtem Speicher zu tun.
Triynko
379

Ich hatte das gleiche Problem. Ich habe hier eine Lösung gefunden http://jakob.engbloms.se/archives/1403

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

Für mich war die Lösung etwas anders. Es war

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

Bevor Sie DLLs neu erstellen, sollten Sie sicherstellen, dass sie nicht verwendet werden:

tasklist /m msys-1.0.dll

Und machen Sie ein Backup:

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

Wenn der Rebase-Befehl mit Folgendes fehlschlägt:

ReBaseImage (msys-1.0.dll) ist mit dem letzten Fehler = 6 fehlgeschlagen

Sie müssen die folgenden Schritte ausführen, um:

  1. Kopieren Sie die DLL in ein anderes Verzeichnis
  2. Starten Sie die Kopie mit den obigen Befehlen neu
  3. Ersetzen Sie die Original-DLL durch die Kopie.

Wenn ein Problem auftritt, führen Sie die Befehle als Administrator aus

Zainengineer
quelle
1
In meinem Fall befand sich rebase.exe im Unterverzeichnis unter / mingw, sodass der Befehl wie folgt lautete: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll und ich habe es ausgeführt, während ich mich in c: befand. Verzeichnis / msysgit / bin.
Robert Oschler
8
Ich gebe diesen Fehler ReBaseImage (msys-1.0.dll) fehlgeschlagen mit dem letzten Fehler = 6
TheJKFever
17
@TheJKFever Sie müssen es an einer Eingabeaufforderung als Administrator ausführen, da es die msys-1.0.dll ändern wird. Erstellen Sie zuerst eine Sicherungskopie der DLL, kopieren Sie sie in msys-1.0.dll.bak und führen Sie den Befehl als Administrator aus. Es hat bei mir funktioniert.
Nikolaos Georgiou
1
Windows 8.1 sagt mir, dass ich diese ausführbare Datei auf diesem PC nicht ausführen kann, wenn ich versuche, sie neu zu starten
Jules GM
2
Ich habe rebase.exe nicht auf meinem Win10 64 Bit Pro, aber das Aufrufen des folgenden hat den Trick (VS2010) ausgeführt: "C: \ Programme (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe "/ REBASE: BASE = 0x50000000 msys-1.0.dll
Paul Bußmann
136

tl; dr: Installieren Sie 64-Bit-Git für Windows 2 .


Technische Details

      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

Dieses Symptom an sich hat nichts mit Image-Basen ausführbarer Dateien, beschädigten Cygwins gemeinsam genutzten Speicherabschnitten, widersprüchlichen Versionen von DLLs usw. zu tun.

Es ist Cygwin-Code, der keinen ~ 5 MB großen Speicherblock für seinen Heap an dieser festen Adresse 0x68570000 zuweisen kann, während dort anscheinend nur ein Loch mit einer Größe von ~ 2,5 MB verfügbar war. Der relevante Code ist in der msysgit-Quelle zu sehen .


Warum ist dieser Teil des Adressraums nicht frei?

Es kann viele Gründe geben. In meinem Fall wurden einige andere Module an einer widersprüchlichen Adresse geladen:

Prozessmodule im Prozess-Explorer

Die letzte Adresse wäre ungefähr 0x68570000 + 5 MB = 0x68C50000, aber es gibt diese WOW64-bezogenen DLLs, die ab 0x68810000 geladen werden und die Zuordnung blockieren.

Wenn eine gemeinsam genutzte DLL vorhanden ist, versucht Windows im Allgemeinen, diese in allen Prozessen unter derselben virtuellen Adresse zu laden, um eine gewisse Umzugsverarbeitung zu sparen. Es ist nur eine Frage des Peches, dass diese Systemkomponenten diesmal irgendwie an einer widersprüchlichen Adresse geladen wurden .


Warum ist Cygwin in deinem Git?

Weil Git eine umfangreiche Suite ist, die aus einigen einfachen Befehlen und vielen hilfreichen Dienstprogrammen besteht und hauptsächlich auf Unix-ähnlichen Systemen entwickelt wurde. Um es ohne massives Umschreiben erstellen und ausführen zu können, ist mindestens eine teilweise Unix-ähnliche Umgebung erforderlich.

Um dies zu erreichen, haben die Leute MinGW und MSYS erfunden - eine minimale Anzahl von Build-Tools, um Programme unter Windows auf Unix-ähnliche Weise zu entwickeln. MSYS enthält auch eine gemeinsam genutzte Bibliothek, msys-1.0.dlldie bei einigen Kompatibilitätsproblemen zwischen den beiden Plattformen zur Laufzeit hilft. Und viele Teile davon wurden Cygwin entnommen, weil dort bereits jemand die gleichen Probleme lösen musste.

Es ist also nicht Cygwin, sondern die Laufzeit-DLL von MinGW, die sich hier komisch verhält.

In Cygwin hat sich dieser Code seit MSYS 1.0 stark verändert - die letzte Commit-Nachricht für diese Datei lautet "Import Cygwin 1.3.4" aus dem Jahr 2001!

Sowohl das aktuelle Cygwin als auch die neue Version von MSYS - MSYS2 - verfügen bereits über eine unterschiedliche Logik, die hoffentlich robuster ist. Es sind nur alte Versionen von Git für Windows, die noch mit dem alten kaputten MSYS-System erstellt wurden.


Saubere Lösungen:

  • Installieren Sie Git für Windows 2 - es wurde mit dem neuen, ordnungsgemäß gewarteten MSYS2 erstellt und verfügt außerdem über viele neue Funktionen, zahlreiche Fehlerkorrekturen, Sicherheitsverbesserungen usw. Wenn möglich, wird auch empfohlen, die 64-Bit-Version zu verwenden . Die Umgehungsumgehung für 32-Bit-Systeme wird jedoch automatisch hinter den Kulissen durchgeführt, sodass die Wahrscheinlichkeit, dass das Problem dort auftritt, ebenfalls geringer ist.
  • Ein einfacher Neustart des Computers, um den Adressraum zu bereinigen (Laden dieser Module unter einer anderen zufälligen Adresse) könnte funktionieren, aber wirklich, aktualisieren Sie einfach auf Git für Windows 2, um die Sicherheitskorrekturen zu erhalten, wenn nichts anderes.

Hacky-Lösungen:

  • Das Ändern PATHkann manchmal funktionieren, da es möglicherweise msys-1.0.dllunterschiedliche Versionen von Git oder anderen MSYS-basierten Anwendungen gibt, die möglicherweise unterschiedliche Adressen, unterschiedliche Größen dieses Heaps usw. verwenden.
  • Ein erneutes Basieren msys-1.0.dllkann Zeitverschwendung sein, da 1) eine DLL bereits Umzugsinformationen enthält und 2) "in jeder Version des Windows-Betriebssystems nicht garantiert werden kann, dass eine (...) DLL immer im selben Adressraum geladen wird". sowieso ( Quelle ). Dies kann nur helfen, wenn das msys-1.0.dllselbst an der widersprüchlichen Adresse geladen wird, die es dann zu verwenden versucht. Anscheinend ist das manchmal der Fall, da dies die Git für Windows-Leute automatisch auf 32-Bit-Systemen tun .
  • In Anbetracht der obigen Ergebnisse habe ich die msys-1.0.dllBinärdatei ursprünglich binär gepatcht , um einen anderen Wert für zu verwenden, _cygheap_startund das Problem wurde sofort behoben.
Yirkha
quelle
1
Vielen Dank für Ihren neugierigen Kommentar! Es stellt sich heraus, dass es schon seit einiger Zeit auf die eine oder andere Weise behoben wurde und die richtige Lösung darin zu bestehen scheint, Git für Windows 2 zu verwenden, das auf MSYS2 (und damit neuerem Cygwin-Code) basiert.
Yirkha
2
Danke, gut zu wissen. Ich verwende die mit Git-Erweiterungen gebündelte Version, was auch immer das ist. Durch einen Neustart wurde das Problem behoben, sodass ich es ignoriere, bis das Update zu mir gelangt. :-)
Tim Abell
3
Perfekte, gut dokumentierte Antwort! Und eine angemessene dauerhafte Lösung des Problems anstelle der derzeit akzeptierten Antwort.
Søren Boisen
2
Ein wenig mehr Details zum Problem - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal
1
x64 Git für Windows hat bei mir und cmder funktioniert. Vielen Dank! Es hat mich verrückt gemacht, besonders mit cmder zu arbeiten. Ich habe den x64 Git-Ordner in das cmder/vendor/git-for-windowsVerzeichnis kopiert und den alten Ordner in umbenannt git-for-windows-x86. Wenn Sie öffnen cmder/vendor/git-for-windows, sehen Sie einen Ordner mingw32, der Ihr Hinweis ist, dass Sie 32-Bit verwenden. Im x64 Git sehen Sie einen Ordner mingw64.
Cmeza
32

Sehr einfache Überprüfung der Rebase-Lösung:

Wechseln Sie zu dem Ordner, in dem git installiert ist, z.

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

Wenn Sie die Umschalttaste gedrückt halten und mit der rechten Maustaste in den Ordner klicken, sollten Sie von dort aus eine Eingabeaufforderung als Administrator öffnen können (danke an https://stackoverflow.com/users/355389/darren-lewis für diesen Kommentar).

Dann renne:

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

Dies hat es für mich behoben, als der Neustart-Ansatz nicht funktionierte.

Ich hoffe es hilft.

Tisch
quelle
1
Hat für mich gearbeitet. Stellen Sie einfach sicher, dass Sie die Eingabeaufforderung als Administrator ausführen.
Darren Lewis
Dies funktionierte auch für mich. Ich weiß nicht, wie Sie mit der rechten Maustaste klicken und cmd.exe als Administrator laden können. Deshalb habe ich cmd.exe mit der rechten Maustaste von Anfang an gestartet. Wählen Sie Start als Administrator und dann CD in das Verzeichnis. Führen Sie dann den Befehl aus. Es funktionierte!
Edencorbin
13

Ich habe die gleiche Fehlermeldung nach dem Upgrade auf git1.8.5.2 gesehen:

Machen Sie einfach eine Suche nach allen msys-1.0.dllauf Ihrem C:\Laufwerk und stellen Sie sicher, dass die von Git verwendete zuerst kommt.

In meinem Fall habe ich zum Beispiel einfach die Reihenfolge geändert:

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

Indem der Git-Pfad C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\in meinem an erster Stelle steht %PATH%, ist die Fehlermeldung verschwunden.

Sie müssen weder neu starten noch die DOS-Sitzung ändern.
Sobald das %PATH%in dieser DOS-Sitzung aktualisiert wurde, funktionieren die git-Befehle einfach.


Beachten Sie, dass carmbrester und Sixto Saez beide Bericht unten (in den Kommentaren), das auf Neustart , um das Problem zu beheben.
Hinweis: Entfernen Sie zunächst alle msys-1.0.dll, z. B. eine in%LOCALAPPDATA%

VonC
quelle
1
Ich hatte msys-1.0.dll nirgendwo anders in meinem Pfad, aber es sieht so aus, als ob Sie genau dort waren - das Verschieben des Git-Teils meines Pfads in der Liste hat das Problem für mich gelöst. Danke für das! - so müde vom Neustart zu beheben.
Carmbrester
1
Meine "zusätzlichen" msys-1.0.DLL-Dateien befinden sich in C: \ Benutzer \ Ihr Login \ AppData \ Local von einer anderen App. Das Entfernen dieser App und das Neustarten haben das Problem für mich behoben
Sixto Saez
@SixtoSaez Interessant. Ich habe die Antwort bearbeitet, um den Neustartschritt besser sichtbar zu machen.
VonC
wahrscheinlich hatten diejenigen, die auch einen Neustart brauchten, genau das gebraucht (ein anderes Problem als das falsche Laden der DLL)
George Birbilis
7

Wenn ein Neustart das Problem nicht behebt (wie in der Antwort von Greg Hegwill vorgeschlagen), überprüfen Sie Ihren PATH auf widersprüchliche Installation (en) der msys-1.0.dll (und möglicherweise anderer verwandter DLLs).

In meiner speziellen Situation hat MinGWs Installation von msys eine Kopie dieser DLL in seinem binVerzeichnis ( <MinGW_Install_Path>\msys\1.0\bin) und sie wurde im PATH aufgelistet. Das cmdVerzeichnis von Git wurde im PFAD aufgeführt, aber binnicht. (Gits Version von msys-1.0.dll befindet sich im binVerzeichnis. Anscheinend fügt die Standardinstallation von MSys-Git sie nicht bindem PATH hinzu.)

Eine vorübergehende Korrektur bestand darin, das binVerzeichnis von Git zum PATH hinzuzufügen, sodass es vor den Pfaden von MinGW angezeigt wird. (Eine dauerhaftere Lösung beinhaltet wahrscheinlich das Aussortieren der Pfadkonflikte zwischen msG von MinGW und Git und / oder das Entfernen der doppelten msys-Installationen.)

RobertB
quelle
Neustart hat es für mich nicht behoben! Es gab wirklich einige doppelte Einträge im Pfad. Danke vielmals.
Reginaldo Santos
2

Ich möchte nur meine Erfahrungen hier teilen. Beim Cross-Compilieren für die MTK-Plattform auf einem Windows 64-Bit-Computer bin ich auf dasselbe Problem gestoßen. MinGW und MSYS sind am Bauprozess beteiligt, und dieses Problem ist aufgetreten. Ich habe es gelöst, indem ich die msys-1.0.dllDatei geändert habe. Weder rebase.exeein Systemneustart hat bei mir funktioniert.

Da auf meinem Computer keine rebase.exe installiert ist. Ich habe cygwin64 installiert und das rebase.exeInnere verwendet:

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

Obwohl die Umbasierung erfolgreich aussah, blieb der Fehler bestehen. Dann habe ich den rebaseBefehl im Cygwin64-Terminal ausgeführt und eine Fehlermeldung erhalten:

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

Ich habe später eine Paaradresse ausprobiert, aber keine hat funktioniert. Also habe ich die msys-1.0.dllDatei geändert und das Problem gelöst.

Funkkopf
quelle
1

Ich bin heute darauf gestoßen. Unter der Leitung von Greg Hewgills Antwort habe ich mir angesehen, wie Prozesse auf meinem System ausgeführt werden, um festzustellen, ob etwas "hängen geblieben" ist oder ob andere Benutzer am Computer angemeldet sind, die etwas mit Git tun. Ich habe dann cygwin (separat installiert) auf diesem bestimmten Computer gestartet. Es startete ok. Ich habe es geschlossen und dann die Git-Erweiterungen erneut versucht (ich habe eine Pull-Operation versucht) und es hat funktioniert. Ich bin mir nicht sicher, ob der Start von Cygwin etwas freigegeben hat, das geteilt wurde, aber dies ist das erste Mal, dass ich auf diesen Fehler gestoßen bin, und dies schien ihn für mich zu beheben.

P_O
quelle
1

Ich hatte das gleiche Problem nach einem Absturz und Update von Windows 8.0 auf msys git 1.9. Ich habe kein msys / git in meinem Pfad gefunden, also habe ich es einfach in den Windows-Einstellungen für lokale Benutzer hinzugefügt. Es funktionierte ohne Neustart.

Im Grunde genommen ähnlich zu RobertB, aber ich habe nicht irgendwelche git / msys in meinem Weg.

Übrigens:

  1. Ich habe versucht, rebase -b blablabla msys.dll zu verwenden, hatte aber den Fehler "ReBaseImage (msys-1.0.dll) ist mit dem letzten Fehler = 6 fehlgeschlagen".

  2. Wenn Sie dies schnell benötigen und keine Zeit zum Debuggen haben, habe ich festgestellt, dass "Git Bash.vbs" im Git-Verzeichnis erfolgreich die Bash-Shell startet.

Koshmaar
quelle
Gleiche Situation für mich. Das Wiederherstellen als Administrator ist fehlgeschlagen. c:\Program Files (x86)\Git\binZum Pfad hinzugefügt und jetzt bin ich golden.
Jon Crowell
1

Dieser Fehler tritt auf meinem Windows-Computer sehr selten auf. Am Ende habe ich den Computer neu gestartet und der Fehler ist behoben.

IgorGanapolsky
quelle
0

Ich bin auf dieses Problem beim LPCEXpresso-Gebäude gestoßen. Wenn Sie das C: \ MinGW \ bin im PATH haben. Irgendwie musste ich es entfernen, um dieses Problem zu beseitigen, da einige andere MinGW-ähnliche ebenfalls darauf basierten

Prashanjit Ghosh
quelle
0

Um dieses Problem zu beheben, lasse ich Tortoise Git einfach das Update installieren.

Jace Browning
quelle
0

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

Sebahattin çatal
quelle
0

Das Löschen der alten Version von% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx hat bei mir funktioniert. Nicht sicher, wie es mit Kommandozeilen-Git verbunden war ...

Barbalion
quelle