Extensions Git: erreur Win32 487: impossible de réserver de l'espace pour le tas de cygwin, erreur Win32 0

342

Extensions Git: Tout fonctionnait bien jusqu'à hier.

Mais tout à coup, je reçois cette erreur lorsque j'essaie de tirer certains référentiels en utilisant 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

Cela se produit pour tous les référentiels que j'ai clonés. Mais, mon git bash fonctionne bien. Je n'ai aucune idée de ce qui se passe. Une idée de pourquoi cela se produit?

Uchia Itachi
la source
5
Cygwin est bizarre et utilise des sections de mémoire partagée persistantes. Avez-vous essayé de redémarrer votre système?
Greg Hewgill
@GregHewgill: Je n'ai pas redémarré depuis quelques jours. Le fera tout de suite.
Uchia Itachi
1
@GregHewgill: Cela a fonctionné. Merci, peut-être que si vous la postez comme réponse, cela sera utile pour les autres aussi.
Uchia Itachi
Je voulais juste dire que ce bogue n'est pas spécifique à git et que les mauvais jours, cygwin plantera sur n'importe quel exécutable de la même manière sans raison apparente.
meneldal
1
OP, vous devez remplacer la réponse sélectionnée par la réponse de @ Yirkha, car celle-ci résout la cause première du problème. Cela peut sauver quelques tentatives inutiles sur les futurs lecteurs (comme cela m'est arrivé).
ysap

Réponses:

230

Cygwin utilise des sections de mémoire partagée persistantes, qui peuvent parfois être endommagées. Le symptôme de cela est que certains programmes Cygwin commencent à échouer, mais d'autres applications ne sont pas affectées. Étant donné que ces sections de mémoire partagée sont persistantes, un redémarrage du système est souvent nécessaire pour les effacer avant que le problème puisse être résolu.

Greg Hewgill
la source
Au cas où cela aiderait quelqu'un, j'ai déplacé le bit GitExtensions dans mon PATH pour être le tout premier élément et il semble avoir résolu le problème pour moi. (J'ai mis le git / cmd lui-même 2e - je ne sais pas si cela en faisait partie). Un peu plus facile qu'un redémarrage ou un brassage .dll.
jinglesthula
6
N'y a-t-il pas un exécutable qui peut juste être interrompu pour libérer de la mémoire? Un redémarrage complet du système semble exagéré. En outre, une réponse ci-dessous ( stackoverflow.com/a/31970708/88409 ) explique quel est vraiment le problème, et cela n'a rien à voir avec une mémoire corrompue.
Triynko
379

J'ai eu le même problème. J'ai trouvé une solution ici http://jakob.engbloms.se/archives/1403

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

Pour moi, la solution était légèrement différente. C'était

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

Avant de rebaser les DLL, vous devez vous assurer qu'elles ne sont pas utilisées:

tasklist /m msys-1.0.dll

Et faites une sauvegarde:

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

Si la commande rebase échoue avec quelque chose comme:

ReBaseImage (msys-1.0.dll) a échoué avec la dernière erreur = 6

Vous devrez effectuer les étapes suivantes dans l'ordre:

  1. Copiez la dll dans un autre répertoire
  2. Rebase la copie en utilisant les commandes ci-dessus
  3. Remplacez la DLL d'origine par la copie.

En cas de problème, exécutez les commandes en tant qu'administrateur

zainengineer
la source
1
Dans mon cas, je rebase.exe était dans le sous-répertoire sous / mingw, donc la commande a fini par être: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll et je l'ai exécuté en étant situé dans le c: répertoire / msysgit / bin.
Robert Oschler
8
J'ai généré cette erreur ReBaseImage (msys-1.0.dll) a échoué avec la dernière erreur = 6
TheJKFever
17
@TheJKFever vous devez l'exécuter dans une invite de commande en tant qu'administrateur, car il va modifier le msys-1.0.dll. Effectuez d'abord une sauvegarde de la DLL, copiez-la dans msys-1.0.dll.bak, puis exécutez la commande en tant qu'administrateur. Ça a marché pour moi.
Nikolaos Georgiou
1
Windows 8.1 me dit que je ne peux pas exécuter cet exécutable sur ce PC lorsque j'essaye de rebaser
Jules GM
2
Je n'ai pas rebase.exe sur mon Win10 64 Bit Pro, mais appeler ce qui suit a fait l'affaire (VS2010): "C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe "/ REBASE: BASE = 0x50000000 msys-1.0.dll
Paul Bußmann
136

tl; dr: installez Git 64 bits pour Windows 2 .


Détails techniques

      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

Ce symptôme en soi n'a rien à voir avec les bases d'images d'exécutables, les sections de mémoire partagée de Cygwin corrompues, les versions conflictuelles des DLL, etc.

C'est le code Cygwin qui n'alloue pas un gros morceau de mémoire de ~ 5 Mo pour son tas à cette adresse fixe 0x68570000, alors que seul un trou de ~ 2,5 Mo était apparemment disponible. Le code pertinent peut être vu dans la source msysgit .


Pourquoi cette partie de l'espace d'adressage n'est-elle pas gratuite?

Il peut y avoir plusieurs raisons. Dans mon cas, il s'agissait d'autres modules chargés à une adresse conflictuelle:

Modules de processus dans Process Explorer

La dernière adresse serait d'environ 0x68570000 + 5 Mo = 0x68C50000, mais il y a ces DLL liées à WOW64 chargées à partir de 0x68810000, qui bloquent l'allocation.

Chaque fois qu'il existe une DLL partagée, Windows en général essaie de la charger à la même adresse virtuelle dans tous les processus pour enregistrer un traitement de relocalisation. C'est juste une question de malchance que ces composants du système se soient en quelque sorte chargés à une adresse conflictuelle cette fois .


Pourquoi y a-t-il Cygwin dans votre Git?

Parce que Git est une suite riche composée de quelques commandes de bas niveau et de nombreux utilitaires utiles, et principalement développée sur des systèmes de type Unix. Afin de pouvoir le construire et l'exécuter sans réécriture massive, il a besoin au moins d'un environnement partiel de type Unix.

Pour ce faire, les gens ont inventé MinGW et MSYS - un ensemble minimal d'outils de construction pour développer des programmes sur Windows à la manière Unix. MSYS contient également une bibliothèque partagée, celle-ci msys-1.0.dll, qui résout certains des problèmes de compatibilité entre les deux plates-formes lors de l'exécution. Et de nombreux éléments ont été extraits de Cygwin, car quelqu'un devait déjà résoudre les mêmes problèmes là-bas.

Ce n'est donc pas Cygwin, c'est la DLL d'exécution de MinGW qui se comporte bizarrement ici.

Dans Cygwin, ce code a en fait beaucoup changé depuis ce qui se trouve dans MSYS 1.0 - le dernier message de validation pour ce fichier dit "Import Cygwin 1.3.4", qui date de 2001!

Les deux Cygwin actuelle et la nouvelle version de MSYS - MSYS2 - ont déjà une logique différente en place, ce qui est plus robuste , espérons. Ce ne sont que les anciennes versions de Git pour Windows qui ont encore été construites en utilisant l'ancien système MSYS cassé.


Solutions propres:

  • Installez Git pour Windows 2 - il est construit avec le nouveau MSYS2 correctement entretenu et possède également de nombreuses nouvelles fonctionnalités, de nombreuses corrections de bugs, des améliorations de sécurité, etc. Si possible, il est également recommandé d' utiliser la version 64 bits . Mais la solution de contournement de rebase est effectuée automatiquement en arrière-plan pour les systèmes 32 bits, donc les chances que le problème se produise là-bas devraient également être plus faibles.
  • Le simple redémarrage de l'ordinateur pour nettoyer l'espace d'adressage (chargement de ces modules à une adresse aléatoire différente) peut fonctionner, mais vraiment, il suffit de mettre à niveau vers Git pour Windows 2 pour obtenir les correctifs de sécurité si rien d'autre.

Solutions hacky:

  • La modification PATHpeut parfois fonctionner car il peut y avoir différentes versions de msys-1.0.dlldans différentes versions de Git ou d'autres applications basées sur MSYS, qui utilisent peut-être une adresse différente, une taille différente de ce tas, etc.
  • Le remodelage msys-1.0.dllpeut être une perte de temps, car 1) étant une DLL, il contient déjà des informations de relocalisation et 2) "dans n'importe quelle version de Windows OS, il n'y a aucune garantie qu'une (...) DLL se charge toujours au même espace d'adressage" de toute façon ( source ). La seule façon dont cela peut aider est que si le msys-1.0.dlllui - même se charge à l'adresse conflictuelle qu'il essaie ensuite d'utiliser. Apparemment, c'est parfois le cas, car c'est ce que les gars de Git pour Windows font automatiquement sur les systèmes 32 bits .
  • Compte tenu des conclusions ci-dessus, j'ai à l'origine binaire corrigé le msys-1.0.dllbinaire pour utiliser une valeur différente _cygheap_startet cela a résolu le problème immédiatement.
Yirkha
la source
1
Merci pour ton curieux commentaire! Il s'avère qu'il a été corrigé d'une manière ou d'une autre depuis un certain temps maintenant et la bonne solution semble être d'utiliser Git pour Windows 2 construit sur MSYS2 (et donc le code Cygwin plus récent).
Yirkha
2
Merci, bon à savoir. J'utilise la version fournie avec git-extensions, quelle qu'elle soit. Le redémarrage l'a corrigé, donc je l'ignorerai jusqu'à ce que la mise à jour me parvienne. :-)
Tim Abell
3
Réponse parfaite et bien documentée! Et une solution permanente appropriée au problème au lieu de la réponse actuellement acceptée.
Søren Boisen
2
Un peu plus de détails sur le problème - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal
1
x64 Git pour Windows a fonctionné pour moi et cmder. Je vous remercie! Cela m'a rendu fou, surtout en travaillant avec cmder. J'ai essentiellement copié le dossier x64 Git dans le cmder/vendor/git-for-windowsrépertoire et renommé l'ancien dossier git-for-windows-x86. Si vous ouvrez cmder/vendor/git-for-windows, vous verrez un dossier mingw32, qui est votre indice que vous utilisez 32 bits. Dans le Git x64, vous verrez un dossier mingw64.
cmeza
32

Version très simple de la solution de rebase:

Accédez au dossier dans lequel git est installé, tel que:

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

En maintenant la touche Maj et clic droit dans le dossier, vous devriez pouvoir ouvrir une invite de commande en tant qu'administrateur à partir de là (merci à https://stackoverflow.com/users/355389/darren-lewis pour ce commentaire),

Exécutez ensuite:

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

Cela m'a corrigé lorsque l'approche de redémarrage ne fonctionnait pas.

J'espère que ça aide.

Tisch
la source
1
A travaillé pour moi. Assurez-vous simplement d'exécuter l'invite de commande en tant qu'administrateur.
Darren Lewis
Cela a également fonctionné pour moi, comme une note, je ne sais pas comment vous pouvez déplacer le clic droit et charger cmd.exe en tant qu'administrateur, j'ai donc lancé cmd.exe avec le bouton droit du début, sélectionnez démarrer en tant qu'administrateur, puis cd dans le répertoire, puis exécutez la commande. Ça a marché!
edencorbin du
13

J'ai vu le même message d'erreur après la mise à niveau vers git1.8.5.2:

Effectuez simplement une recherche de tout msys-1.0.dllsur votre C:\disque et faites en sorte que celui utilisé par Git passe en premier.

Par exemple, dans mon cas, j'ai simplement changé l'ordre de:

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

En faisant C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\passer le chemin Git en premier dans mon %PATH%, le message d'erreur a disparu.

Pas besoin de redémarrer ou même de changer la session DOS.
Une fois le %PATH%mis à jour dans cette session DOS, les commandes git fonctionnent.


Notez que carmbrester et Sixto Saez signalent tous les deux ci-dessous (dans les commentaires) avoir à redémarrer afin de résoudre le problème.
Remarque: Tout d' abord, enlever tout aussi msys-1.0.dll, comme celui%LOCALAPPDATA%

VonC
la source
1
Je n'avais msys-1.0.dll nulle part ailleurs sur mon chemin, mais il semble que vous ayez raison sur quelque chose - déplacer la partie git de mon chemin plus haut dans la liste a résolu le problème pour moi. Merci pour ça! - tellement fatigué de redémarrer pour réparer.
carmbrester
1
Mes fichiers "extra" msys-1.0.DLL dans le C: \ Users \ votre login \ AppData \ Local d'une autre application. La suppression de cette application et le redémarrage ont résolu le problème pour moi
Sixto Saez
@SixtoSaez Intéressant. J'ai modifié la réponse pour rendre l'étape de redémarrage plus visible.
VonC
probablement ceux qui avaient également besoin d'un redémarrage en avaient besoin (un problème différent du mauvais chargement de DLL)
George Birbilis
7

Si un redémarrage ne résout pas le problème (comme suggéré par la réponse de Greg Hegwill), vérifiez votre chemin d'accès pour les installations en conflit du msys-1.0.dll (et éventuellement d'autres DLL connexes).

Dans ma situation particulière, l'installation de msG par MinGW a une copie de cette DLL dans son binrépertoire ( <MinGW_Install_Path>\msys\1.0\bin), et elle a été répertoriée dans le CHEMIN. Le cmdrépertoire de Git était répertorié dans le PATH, mais ce binn'était pas le cas. (La version Git de msys-1.0.dll se trouve dans le binrépertoire. Apparemment, l'installation par défaut de MSys-Git n'ajoute pas son binau PATH.)

Un correctif temporaire consistait à ajouter le binrépertoire de Git au PATH afin qu'il apparaisse avant les chemins de MinGW. (Un correctif plus permanent impliquera probablement de trier les conflits de chemin entre les msys de MinGW et Git et / ou de supprimer les installations msys en double.)

RobertB
la source
Le redémarrage n'a pas résolu le problème pour moi! Il y avait vraiment des entrées en double dans le chemin. Merci beaucoup.
Reginaldo Santos
2

Je veux juste partager mon expérience ici. Je suis tombé sur le même problème lors de la compilation croisée pour la plate-forme MTK sur une machine Windows 64 bits. MinGW et MSYS sont impliqués dans le processus de construction et ce problème est apparu. Je l'ai résolu en modifiant le msys-1.0.dllfichier. Ni le rebase.exeredémarrage du système n'ont fonctionné pour moi.

Puisqu'aucun rebase.exe n'est installé sur mon ordinateur. J'ai installé cygwin64 et utilisé l' rebase.exeintérieur:

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

Bien que le rebasage ait semblé réussi, l'erreur est restée. Ensuite, j'ai exécuté la rebasecommande à l'intérieur du terminal Cygwin64 et j'ai obtenu une erreur:

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

Plus tard, j'ai essayé une adresse de couple mais aucun d'eux n'a fonctionné. J'ai donc fini par changer le msys-1.0.dllfichier et cela a résolu le problème.

radiohead
la source
1

J'ai rencontré ça aujourd'hui. Guidé par la réponse de Greg Hewgill, j'ai examiné les processus en cours d'exécution sur mon système pour voir si quelque chose était «bloqué» ou si d'autres utilisateurs étaient connectés à la machine en faisant quelque chose avec git. J'ai ensuite lancé cygwin (installé séparément) sur cette machine particulière. Il a lancé ok. Je l'ai fermé, puis j'ai essayé à nouveau les extensions Git (j'essayais une opération de traction) et cela a fonctionné. Je ne sais pas si le lancement de cygwin a effacé quelque chose qui a été partagé, mais c'est la première fois que je rencontre cette erreur et cela semble la corriger pour moi.

P_O
la source
1

J'ai eu le même problème, après un crash et une mise à jour de Windows 8.0, sur msys git 1.9. Je n'ai trouvé aucun msys / git sur mon chemin, je l'ai donc ajouté dans les paramètres d'environnement de l'utilisateur local de Windows. Cela a fonctionné sans redémarrer.

Fondamentalement, similaire à RobertB, mais je n'avais aucun git / msys sur mon chemin.

Btw:

  1. J'ai essayé d'utiliser rebase -b blablabla msys.dll, mais l'erreur "ReBaseImage (msys-1.0.dll) a échoué avec la dernière erreur = 6"

  2. si vous en avez besoin rapidement et que vous n'avez pas le temps de déboguer, j'ai remarqué que "Git Bash.vbs" dans le répertoire Git démarre avec succès le shell bash.

Koshmaar
la source
Même situation pour moi. La réinitialisation en tant qu'administrateur a échoué. Ajouté c:\Program Files (x86)\Git\binau chemin et maintenant je suis en or.
Jon Crowell
1

Cette erreur se produit très rarement sur ma machine Windows. J'ai fini par redémarrer la machine et l'erreur a disparu.

IgorGanapolsky
la source
0

J'ai rencontré ce problème avec le bâtiment LPCEXpresso. Si vous avez le C: \ MinGW \ bin dans le CHEMIN. en quelque sorte, je devais le supprimer pour se débarrasser de ce problème car certains autres MinGW comme basés trop

Prashanjit Ghosh
la source
0

Pour résoudre ce problème, je laisse simplement Tortoise Git installer sa mise à jour.

Jace Browning
la source
0

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

sebahattin çatal
la source
0

La suppression de l'ancienne version de% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx a fonctionné pour moi. Je ne sais pas comment il était connecté à la ligne de commande git ...

barbalion
la source