Extensiones Git: error Win32 487: no se pudo reservar espacio para el montón de cygwin, error Win32 0

342

Extensiones Git: Todo estaba funcionando bien hasta ayer.

Pero de repente recibo este error cuando intento extraer algunos repositorios 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

Está sucediendo para todos los repositorios que he clonado. Pero mi git bash funciona bien. No tengo idea de lo que está pasando. ¿Alguna idea de por qué sucede esto?

Uchia Itachi
fuente
55
Cygwin es raro y usa secciones persistentes de memoria compartida. ¿Has intentado reiniciar tu sistema?
Greg Hewgill
@GregHewgill: No se ha reiniciado desde hace unos días. Lo haremos de inmediato.
Uchia Itachi
1
@ GregHewgill: Funcionó. Gracias, tal vez si lo publicas como respuesta también será útil para otros.
Uchia Itachi
Solo quería decir que este error no es específico de git y en los días malos cygwin se bloqueará en cualquier ejecutable de la misma manera sin razón aparente.
meneldal
1
OP, debe cambiar la respuesta seleccionada a la respuesta de @ Yirkha, ya que esa resuelve la causa raíz del problema. Puede ahorrar algunos intentos inútiles en futuros lectores (como me pasó a mí).
ysap

Respuestas:

230

Cygwin utiliza secciones persistentes de memoria compartida, que en ocasiones pueden corromperse. El síntoma de esto es que algunos programas de Cygwin comienzan a fallar, pero otras aplicaciones no se ven afectadas. Dado que estas secciones de memoria compartida son persistentes, a menudo es necesario reiniciar el sistema para eliminarlas antes de que se pueda resolver el problema.

Greg Hewgill
fuente
En caso de que ayude a alguien, moví el bit GitExtensions en mi RUTA para ser el primer elemento y parece haber resuelto el problema por mí. (Puse el git / cmd en segundo lugar, no estoy seguro de si eso era parte de él). Un poco más fácil que reiniciar o arrastrar archivos .dll.
jinglesthula
66
¿No hay un ejecutable que pueda terminarse para liberar la memoria? Un reinicio completo del sistema parece excesivo. Además, una respuesta a continuación ( stackoverflow.com/a/31970708/88409 ) explica cuál es realmente el problema y no tiene nada que ver con la memoria dañada.
Triynko
379

Yo tuve el mismo problema. Encontré la solución aquí http://jakob.engbloms.se/archives/1403

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

Para mí la solución fue ligeramente diferente. Era

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

Antes de reajustar dlls, debe asegurarse de que no esté en uso:

tasklist /m msys-1.0.dll

Y haz una copia de seguridad:

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

Si el comando rebase falla con algo como:

ReBaseImage (msys-1.0.dll) falló con el último error = 6

Deberá realizar los siguientes pasos en orden:

  1. Copie el dll a otro directorio
  2. Rebase la copia usando los comandos anteriores
  3. Reemplace el dll original con la copia.

Si hay algún problema, ejecute los comandos como administrador

zainengineer
fuente
1
En mi caso, rebase.exe estaba en el subdirectorio bajo / mingw, por lo que el comando terminó siendo: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll y lo ejecuté mientras estaba ubicado en c: / msysgit / bin directorio.
Robert Oschler
8
Confirmo que este error ReBaseImage (msys-1.0.dll) falló con el último error = 6
TheJKFever
17
@TheJKSin embargo, debe ejecutarlo en un símbolo del sistema como Administrador, ya que va a modificar el msys-1.0.dll. Primero haga una copia de seguridad de la dll, cópiela en msys-1.0.dll.bak, luego ejecute el comando como Administrador. Funcionó para mi.
Nikolaos Georgiou
1
Windows 8.1 me dice que no puedo ejecutar este ejecutable en esta PC cuando trato de cambiar la base
Jules GM
2
No tengo rebase.exe en mi Win10 64 Bit Pro, pero llamar al siguiente hizo el truco (VS2010): "C: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe "/ REBASE: BASE = 0x50000000 msys-1.0.dll
Paul Bußmann
136

tl; dr: Instale Git de 64 bits para Windows 2 .


Detalles técnicos

      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

Este síntoma por sí solo no tiene nada que ver con bases de imágenes de ejecutables, secciones de memoria compartida de Cygwin corruptas, versiones conflictivas de DLL, etc.

Es el código de Cygwin que no puede asignar una gran parte de memoria de ~ 5 MB para su almacenamiento dinámico en esta dirección fija 0x68570000, mientras que aparentemente solo hay un agujero ~ 2.5 MB de gran tamaño disponible allí. El código relevante se puede ver en la fuente msysgit .


¿Por qué esa parte del espacio de direcciones no es gratuita?

Puede haber muchas razones. En mi caso, fueron algunos otros módulos cargados en una dirección en conflicto:

Módulos de proceso en Process Explorer

La última dirección sería alrededor de 0x68570000 + 5 MB = 0x68C50000, pero hay estas DLL relacionadas con WOW64 cargadas desde 0x68810000 en adelante, que bloquean la asignación.

Cada vez que hay una DLL compartida, Windows en general intenta cargarla en la misma dirección virtual en todos los procesos para guardar algunos procesos de reubicación. Es solo una cuestión de mala suerte que estos componentes del sistema se hayan cargado de alguna manera en una dirección en conflicto esta vez .


¿Por qué hay Cygwin en tu Git?

Porque Git es un conjunto rico que consta de algunos comandos de bajo nivel y muchas utilidades útiles, y desarrollado principalmente en sistemas tipo Unix. Para poder construirlo y ejecutarlo sin una reescritura masiva, necesita al menos un entorno similar a Unix parcial.

Para lograr eso, las personas han inventado MinGW y MSYS, un conjunto mínimo de herramientas de compilación para desarrollar programas en Windows de manera similar a Unix. MSYS también contiene una biblioteca compartida, esto msys-1.0.dll, que ayuda con algunos de los problemas de compatibilidad entre las dos plataformas durante el tiempo de ejecución. Y muchas partes de eso han sido tomadas de Cygwin, porque alguien ya tenía que resolver los mismos problemas allí.

Entonces, no es Cygwin, es la DLL de tiempo de ejecución de MinGW lo que se está comportando raro aquí.

En Cygwin, este código ha cambiado mucho desde lo que hay en MSYS 1.0: el último mensaje de confirmación para ese archivo dice "Importar Cygwin 1.3.4", ¡que es de 2001!

Tanto Cygwin actual como la nueva versión de MSYS , MSYS2, ya tienen una lógica diferente, lo que es de esperar que sea más robusto. Solo las versiones antiguas de Git para Windows se han creado utilizando el antiguo sistema MSYS roto.


Soluciones limpias:

  • Instale Git para Windows 2 : está construido con el nuevo MSYS2 mantenido correctamente y también tiene muchas características nuevas, muchas correcciones de errores, mejoras de seguridad, etc. Si es posible, también se recomienda utilizar la versión de 64 bits . Pero la solución alternativa de rebase se realiza automáticamente detrás de escena para sistemas de 32 bits, por lo que las posibilidades de que el problema ocurra allí también deberían ser menores.
  • Simplemente reiniciar la computadora para limpiar el espacio de direcciones (cargar estos módulos en una dirección aleatoria diferente) podría funcionar, pero en realidad, simplemente actualice a Git para Windows 2 para obtener las soluciones de seguridad, si nada más.

Soluciones Hacky:

  • El cambio a PATHveces puede funcionar porque puede haber diferentes versiones de msys-1.0.dlldiferentes versiones de Git u otras aplicaciones basadas en MSYS, que tal vez usen diferentes direcciones, diferentes tamaños de este montón, etc.
  • Rebasar msys-1.0.dllpodría ser una pérdida de tiempo, porque 1) al ser una DLL, ya tiene información de reubicación y 2) "en cualquier versión del sistema operativo Windows no hay garantía de que una (...) DLL siempre se cargue en el mismo espacio de direcciones" de todos modos ( fuente ). La única forma en que esto puede ayudar es si el msys-1.0.dllmismo se carga en la dirección en conflicto que está tratando de usar. Aparentemente ese es el caso a veces, ya que esto es lo que los chicos de Git para Windows están haciendo automáticamente en sistemas de 32 bits .
  • Teniendo en cuenta los hallazgos anteriores, originalmente binario parcheé el msys-1.0.dllbinario para usar un valor diferente _cygheap_starty eso resolvió el problema de inmediato.
Yirkha
fuente
1
Gracias por tu curioso comentario! Resulta que se ha solucionado de una forma u otra durante bastante tiempo y la solución adecuada parece ser usar Git para Windows 2 integrado en MSYS2 (y, por lo tanto, el código Cygwin más reciente).
Yirkha
2
Gracias, es bueno saberlo. Estoy usando la versión incluida con git-extensions, sea lo que sea. El reinicio lo arregló, así que lo ignoraré hasta que la actualización llegue a mí. :-)
Tim Abell
3
¡Respuesta perfecta y bien documentada! Y una solución permanente adecuada al problema en lugar de la respuesta actualmente aceptada.
Søren Boisen
2
Un poco más de detalle sobre el problema - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal
1
x64 Git para windows funcionó para mí y cmder. ¡Gracias! Me ha estado volviendo loco, especialmente trabajando con cmder. Básicamente copié la carpeta x64 Git en el cmder/vendor/git-for-windowsdirectorio y cambié el nombre de la carpeta anterior a git-for-windows-x86. Si abres cmder/vendor/git-for-windows, verás una carpeta mingw32, que es tu pista de que estás usando 32 bits. En el x64 Git, verá una carpeta mingw64.
cmeza
32

Versión muy simple de la solución de rebase:

Vaya a la carpeta donde está instalado git, como:

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

Al mantener presionada la tecla Mayús y hacer clic derecho en la carpeta, debería poder abrir un símbolo del sistema como administrador desde allí (gracias a https://stackoverflow.com/users/355389/darren-lewis por ese comentario),

Entonces corre:

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

Esto me lo solucionó cuando el enfoque de reinicio no funcionó.

Espero eso ayude.

Tisch
fuente
1
Trabajó para mi. Solo asegúrese de ejecutar el símbolo del sistema como administrador.
Darren Lewis
Esto también funcionó para mí, como nota, no sé cómo podría hacer clic derecho y cargar cmd.exe como administrador, por lo que lancé el botón derecho de cmd.exe desde el inicio, seleccione iniciar como administrador, luego cd en el directorio, luego ejecuta el comando. ¡Funcionó!
edencorbin
13

He visto el mismo mensaje de error después de actualizar a git1.8.5.2:

Simplemente haga una búsqueda de todo msys-1.0.dllen suC:\ disco, y haga que el que use Git sea lo primero.

Por ejemplo, en mi caso simplemente cambié el orden 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

Al hacer que el camino de Git sea lo C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\primero en mi%PATH% , el mensaje de error desapareció.

No es necesario reiniciar o incluso cambiar la sesión de DOS.
Una vez que %PATH%se actualiza en esa sesión de DOS, los comandos git simplemente funcionan.


Tenga en cuenta que carmbrester y Sixto Saez informan a continuación (en los comentarios) que deben reiniciarse para solucionar el problema.
Nota: Primero, también elimina cualquiera msys-1.0.dll, como uno en%LOCALAPPDATA%

VonC
fuente
1
No tenía msys-1.0.dll en ningún otro lugar de mi camino, pero parece que tenía razón en algo allí: mover la parte git de mi camino más arriba en la lista me resolvió el problema. ¡Gracias por eso! - Estoy tan cansado de reiniciar para arreglar.
carmbrester
1
Mis archivos "extra" msys-1.0.DLL estaban en C: \ Users \ your login \ AppData \ Local desde otra aplicación. Eliminar esa aplicación y reiniciar me solucionó el problema
Sixto Saez
@SixtoSaez Interesante. He editado la respuesta para que el paso de reinicio sea más visible.
VonC
probablemente aquellos que también necesitaban reiniciar habían necesitado precisamente eso (un problema diferente de la carga incorrecta de DLL)
George Birbilis
7

Si un reinicio no corrige el problema (como sugiere la respuesta de Greg Hegwill), verifique su RUTA en busca de instalaciones conflictivas de msys-1.0.dll (y posiblemente otras DLL relacionadas).

En mi situación particular, la instalación de msys de MinGW tiene una copia de esa DLL en su bindirectorio ( <MinGW_Install_Path>\msys\1.0\bin), y fue incluida en la RUTA. El cmddirectorio de Git figuraba en la RUTA, pero binno lo estaba. (La versión de msit-1.0.dll de Git está en el bindirectorio. Aparentemente, la instalación predeterminada de MSys-Git no la agrega bina la RUTA).

Una solución temporal fue agregar el bindirectorio de Git a la RUTA para que aparezca antes de las rutas de MinGW. (Una solución más permanente probablemente implicará resolver los conflictos de ruta entre el msys de MinGW y los de Git y / o eliminar las instalaciones de msys duplicadas).

RobertB
fuente
¡Reiniciar no me lo solucionó! Realmente había algunas entradas duplicadas en el camino. Muchas gracias.
Reginaldo Santos
2

Solo quiero compartir mi experiencia aquí. Me encontré con el mismo problema al realizar una compilación cruzada para la plataforma MTK en una máquina con Windows de 64 bits. MinGW y MSYS están involucrados en el proceso de construcción y este problema apareció. Lo resolví cambiando el msys-1.0.dllarchivo. Ni el rebase.exereinicio del sistema funcionó para mí.

Como no hay rebase.exe instalado en mi computadora. Instalé cygwin64 y usé el rebase.exeinterior:

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

Aunque el rebase parecía exitoso, el error permaneció. Luego ejecuté el rebasecomando dentro del terminal Cygwin64 y obtuve un error:

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

Más tarde probé un par de direcciones pero ninguno de ellos funcionó. Así que terminé cambiando el msys-1.0.dllarchivo y resolvió el problema.

radiohead
fuente
1

Me encontré con esto hoy. Dirigido por la respuesta de Greg Hewgill, miré los procesos en ejecución en mi sistema para ver si algo estaba "atascado" o si otros usuarios habían iniciado sesión en la máquina haciendo algo con git. Luego lancé cygwin (instalado por separado) en esta máquina en particular. Se lanzó bien. Lo cerré y luego probé las Extensiones Git nuevamente (estaba intentando una operación de extracción) y funcionó. No estoy seguro de si el lanzamiento de cygwin borró algo que se compartió, pero esta es la primera vez que me encontré con este error y esto pareció solucionarlo.

CORREOS
fuente
1

Tuve el mismo problema, después de un bloqueo y actualización de Windows 8.0, en msys git 1.9. No encontré ningún msys / git en mi camino, así que lo agregué en la configuración del entorno del usuario local de Windows. Funcionó sin reiniciar.

Básicamente, similar a RobertB, pero no tenía ningún git / msys en mi camino.

Por cierto:

  1. Intenté usar rebase -b blablabla msys.dll, pero tuve el error "ReBaseImage (msys-1.0.dll) falló con el último error = 6"

  2. si necesita esto rápidamente y no tiene tiempo de depuración, noté que "Git Bash.vbs" en el directorio Git inicia con éxito bash shell.

Koshmaar
fuente
La misma situación para mí. Rebasando como administrador fallido. Agregado c:\Program Files (x86)\Git\bina la ruta y ahora soy dorado.
Jon Crowell
1

Este error ocurre muy raramente en mi máquina Windows. Terminé reiniciando la máquina, y el error desapareció.

IgorGanapolsky
fuente
0

He encontrado este problema con el edificio LPCEXpresso. Si tienes el C: \ MinGW \ bin en la RUTA. de alguna manera tuve que eliminarlo para deshacerme de este problema, ya que algunos otros MinGW también se basan

Prashanjit Ghosh
fuente
0

Para solucionar este problema, simplemente dejo que Tortoise Git instale su actualización.

Jace Browning
fuente
0

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

sebahattin çatal
fuente
0

Eliminar la versión anterior de% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx funcionó para mí. No estoy seguro de cómo estaba conectado a la línea de comando git ...

barbalion
fuente