Extensões Git: erro Win32 487: não foi possível reservar espaço para a pilha do cygwin, erro Win32 0

342

Extensões Git: Tudo estava funcionando bem até ontem.

Mas de repente eu recebo esse erro quando tento extrair alguns repositórios 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

Isso está acontecendo para todos os repositórios que eu clonei. Mas, meu git bash está funcionando bem. Eu não tenho ideia do que está acontecendo. Alguma idéia de por que isso está acontecendo?

Uchia Itachi
fonte
5
Cygwin é estranho e usa seções persistentes de memória compartilhada. Você já tentou reiniciar o sistema?
precisa saber é o seguinte
@ GregHewgill: Não reinicia há alguns dias. Fará isso imediatamente.
Uchia Itachi
11
@ GregHewgill: Funcionou. Obrigado, talvez se você publicá-lo como resposta, também será útil para outras pessoas.
Uchia Itachi
Só queria dizer que esse bug não é específico do git e, nos dias ruins, o cygwin trava em qualquer executável da mesma maneira, sem motivo aparente.
meneldal
11
OP, você deve alterar a resposta selecionada para a resposta de @ Yirkha, pois ela resolve a causa raiz do problema. Isso pode salvar algumas tentativas fúteis de futuros leitores (como aconteceu comigo).
ysap

Respostas:

230

Cygwin usa seções persistentes de memória compartilhada, que podem ocasionalmente ser corrompidas. O sintoma disso é que alguns programas Cygwin começam a falhar, mas outros aplicativos não são afetados. Como essas seções de memória compartilhada são persistentes, geralmente é necessário reiniciar o sistema para limpá-las antes que o problema possa ser resolvido.

Greg Hewgill
fonte
Caso isso ajude alguém, mudei o bit GitExtensions no meu PATH para ser o primeiro item e parece ter resolvido o problema para mim. (Coloquei o git / cmd em segundo - não tenho certeza se isso fazia parte). Um pouco mais fácil do que uma reinicialização ou .dll baralhar.
Jinglesthula 02/12/16
6
Não existe um executável que possa ser finalizado para liberar a memória? Uma reinicialização completa do sistema parece um exagero. Além disso, uma resposta abaixo ( stackoverflow.com/a/31970708/88409 ) explica qual é realmente o problema e não tem nada a ver com memória corrompida.
Triynko
379

Eu tive o mesmo problema. Encontrei solução aqui http://jakob.engbloms.se/archives/1403

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

Para mim, a solução foi um pouco diferente. isso foi

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

Antes de refazer as DLLs, verifique se ele não está em uso:

tasklist /m msys-1.0.dll

E faça um backup:

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

Se o comando rebase falhar com algo como:

ReBaseImage (msys-1.0.dll) falhou com o último erro = 6

Você precisará executar as seguintes etapas em ordem:

  1. Copie a dll para outro diretório
  2. Rebase a cópia usando os comandos acima
  3. Substitua a dll original pela cópia.

Se algum problema executar os comandos como administrador

zainengineer
fonte
11
No meu caso, o rebase.exe estava no subdiretório em / mingw, portanto o comando acabou sendo: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll e executei-o enquanto estava localizado em c: Diretório / msysgit / bin.
Robert Oschler
8
Git este erro ReBaseImage (msys-1.0.dll) falhou com o último erro = 6
TheJKFever
17
@TheJKFever, você precisa executá-lo em um prompt de comando como Administrador, porque ele modificará o msys-1.0.dll. Faça um backup da dll primeiro, copie-o para msys-1.0.dll.bak e execute o comando como Administrador. Funcionou para mim.
Nikolaos Georgiou
11
janelas 8,1 me diz que não pode executar este executável neste pc quando eu tento rebase
Jules GM
2
Não tenho rebase.exe no meu Win10 64 Bit Pro, mas o seguinte procedimento foi feito (VS2010): "C: \ Arquivos de Programas (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 o Git de 64 bits para Windows 2 .


Detalhes 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

Esse sintoma, por si só, não tem nada a ver com bases de imagens de executáveis, seções de memória compartilhada do Cygwin corrompidas, versões conflitantes de DLLs etc.

É o código Cygwin que falha ao alocar um pedaço grande de ~ 5 MB de memória para seu heap neste endereço fixo 0x68570000, enquanto apenas um buraco ~ 2,5 MB grande estava aparentemente disponível lá. O código relevante pode ser visto na fonte msysgit .


Por que essa parte do espaço de endereço não é livre?

Pode haver muitas razões. No meu caso, foram alguns outros módulos carregados em um endereço conflitante:

Módulos de processo no Process Explorer

O último endereço seria em torno de 0x68570000 + 5 MB = 0x68C50000, mas existem essas DLLs relacionadas ao WOW64 carregadas de 0x68810000 para cima, que bloqueiam a alocação.

Sempre que houver alguma DLL compartilhada, o Windows em geral tenta carregá-la no mesmo endereço virtual em todos os processos para salvar algum processamento de realocação. É apenas uma questão de má sorte que esses componentes do sistema tenham sido carregados de alguma forma em um endereço conflitante dessa vez .


Por que existe o Cygwin no seu Git?

Porque o Git é uma suíte rica que consiste em alguns comandos de baixo nível e muitos utilitários úteis, e principalmente desenvolvidos em sistemas similares ao Unix. Para poder construí-lo e executá-lo sem reescrever em massa, ele precisa de pelo menos um ambiente parecido com o Unix.

Para conseguir isso, as pessoas inventaram o MinGW e o MSYS - um conjunto mínimo de ferramentas de criação para desenvolver programas no Windows de maneira semelhante ao Unix. O MSYS também contém uma biblioteca compartilhada msys-1.0.dll, que ajuda com alguns dos problemas de compatibilidade entre as duas plataformas durante o tempo de execução. E muitas partes foram tiradas do Cygwin, porque alguém já tinha que resolver os mesmos problemas lá.

Portanto, não é Cygwin, é a DLL de tempo de execução do MinGW que está se comportando de forma estranha aqui.

No Cygwin, esse código realmente mudou muito desde o que está no MSYS 1.0 - a última mensagem de confirmação desse arquivo diz "Importar Cygwin 1.3.4", que é de 2001!

O Cygwin atual e a nova versão do MSYS - MSYS2 - já possuem uma lógica diferente, o que é esperançosamente mais robusto. São apenas as versões antigas do Git for Windows que ainda foram criadas usando o antigo sistema MSYS quebrado.


Soluções limpas:

  • Instale o Git para Windows 2 - ele foi desenvolvido com o novo MSYS2 , com manutenção adequada e também possui muitos recursos novos, muitas correções de bugs, melhorias de segurança e assim por diante. Se possível, também é recomendável usar a versão de 64 bits . Mas a solução alternativa de rebase é executada automaticamente nos bastidores para sistemas de 32 bits, portanto as chances de o problema acontecer também devem ser menores.
  • Simplesmente reiniciar o computador para limpar o espaço de endereço (carregar esses módulos em um endereço aleatório diferente) pode funcionar, mas, na verdade, basta atualizar para o Git for Windows 2 para obter as correções de segurança, se nada mais.

Soluções Hacky:

  • PATHÀs vezes, alterar pode funcionar porque pode haver versões diferentes de versões msys-1.0.dlldiferentes do Git ou de outros aplicativos baseados em MSYS, que talvez usem endereços diferentes, tamanhos diferentes desse heap etc.
  • Rebasing msys-1.0.dllpode ser um desperdício de tempo, porque 1) como uma DLL, já possui informações de realocação e 2) "em qualquer versão do sistema operacional Windows, não há garantia de que uma (...) DLL sempre seja carregada no mesmo espaço de endereço" de qualquer maneira ( fonte ). A única maneira de ajudar é se o msys-1.0.dllpróprio carregamento no endereço conflitante que está tentando usar. Aparentemente, esse é o caso algumas vezes, pois é isso que os caras do Git for Windows estão fazendo automaticamente em sistemas de 32 bits .
  • Considerando as descobertas acima, eu originalmente corrigi o msys-1.0.dllbinário para usar um valor diferente _cygheap_starte isso resolveu o problema imediatamente.
Yirkha
fonte
11
Obrigado pelo seu comentário curioso! Acontece que ele foi corrigido de uma maneira ou de outra por um bom tempo e a solução adequada parece ser usar o Git for Windows 2 desenvolvido no MSYS2 (e, portanto, o código Cygwin mais recente).
Yirkha
2
Obrigado, bom saber. Estou usando a versão empacotada com git-extensions, seja o que for. A reinicialização foi corrigida, então eu a ignorarei até que a atualização chegue até mim. :-)
Tim Abell
3
Resposta perfeita e bem documentada! E uma solução permanente adequada para o problema, em vez da resposta atualmente aceita.
Søren Boisen 9/12/2015
2
Um pouco mais detalhes sobre o problema - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal
11
x64 O Git para Windows funcionou para mim e para o cmder. Obrigado! Isso está me deixando louco, especialmente trabalhando com cmder. Basicamente, copiei a pasta x64 Git para o cmder/vendor/git-for-windowsdiretório e renomeei a pasta antiga para git-for-windows-x86. Se você abrir cmder/vendor/git-for-windows, verá uma pasta mingw32, que é sua pista de que você está usando 32 bits. No x64 Git, você verá uma pasta mingw64.
Cm07
32

Versão muito simples da solução rebase:

Vá para a pasta em que o git está instalado, como:

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

Mantendo Shift e clique com o botão direito do mouse na pasta, você poderá abrir um prompt de comando como administrador (graças a https://stackoverflow.com/users/355389/darren-lewis pelo comentário),

Então corra:

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

Isso foi corrigido para mim quando a abordagem de reinicialização não funcionou.

Espero que ajude.

Tisch
fonte
11
Trabalhou para mim. Apenas certifique-se de executar o prompt de comando como administrador.
Darren Lewis
Isso também funcionou para mim. Como observação, não sei como você pode alternar com o botão direito do mouse e carregar o cmd.exe como administrador. Por isso, iniciei o cmd.exe com o botão direito do mouse em start, selecione start como admin e depois entre no diretório, em seguida, execute o comando Funcionou!
Edencorbin
13

Eu vi a mesma mensagem de erro após atualizar para o git1.8.5.2:

Basta fazer uma pesquisa por tudo msys-1.0.dllno seu C:\disco e fazer com que o usado pelo Git seja o primeiro.

Por exemplo, no meu caso, simplesmente mudei a ordem 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

Ao fazer o caminho do Git C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\vir em primeiro lugar no meu %PATH%, a mensagem de erro desapareceu.

Não há necessidade de reiniciar ou alterar a sessão do DOS.
Depois que ele %PATH%é atualizado nessa sessão do DOS, os comandos git simplesmente funcionam.


Observe que carmbrester e Sixto Saez relatam abaixo (nos comentários) ter que reiniciar para corrigir o problema.
Nota: Primeiro, também remova qualquer um msys-1.0.dll, como um%LOCALAPPDATA%

VonC
fonte
11
Eu não tinha o msys-1.0.dll em nenhum outro lugar no meu caminho, mas parece que você estava certo em alguma coisa lá - mover a parte git do meu caminho mais alto na lista resolveu o problema para mim. Obrigado por isso! - tão cansado de reiniciar para consertar.
precisa saber é o seguinte
11
Meus arquivos "extra" msys-1.0.DLL estavam em C: \ Users \ seu login \ AppData \ Local de outro aplicativo. Removendo esse aplicativo e reiniciar resolveu o problema para mim
Sixto Saez
@SixtoSaez Interesting. Editei a resposta para tornar a etapa de reinicialização mais visível.
VonC 25/09
provavelmente aqueles que também precisava de um reboot precisava apenas isso (uma questão diferente do carregamento DLL errado)
George Birbilis
7

Se uma reinicialização não corrigir o problema (como sugerido pela resposta de Greg Hegwill), verifique o PATH quanto a instalações conflitantes do msys-1.0.dll (e possivelmente outras DLLs relacionadas).

Na minha situação específica, a instalação do msys do MinGW possui uma cópia dessa DLL em seu bindiretório ( <MinGW_Install_Path>\msys\1.0\bin) e foi listada no PATH. O cmddiretório do Git estava listado no PATH, mas binnão estava. (A versão do msys-1.0.dll do Git está no bindiretório. Aparentemente, a instalação padrão do MSys-Git não a adiciona binao PATH.)

Uma correção temporária foi adicionar o bindiretório do Git ao PATH para que ele apareça antes dos caminhos do MinGW. (Uma correção mais permanente provavelmente envolverá a separação dos conflitos de caminho entre os msys do MinGW e os do Git e / ou a remoção das instalações duplicadas do msys.)

RobertB
fonte
A reinicialização não corrigiu isso para mim! Havia realmente algumas entradas duplicadas no caminho. Tks muito.
Reginaldo Santos
2

Só quero compartilhar minha experiência aqui. Me deparei com o mesmo problema durante a compilação cruzada para a plataforma MTK em uma máquina Windows de 64 bits. MinGW e MSYS estão envolvidos no processo de construção e esse problema surgiu. Eu resolvi alterando o msys-1.0.dllarquivo. Nem a rebase.exereinicialização do sistema funcionou para mim.

Como não há rebase.exe instalado no meu computador. Instalei o cygwin64 e usei o rebase.exeinterior:

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

Embora o rebasing parecesse bem-sucedido, o erro permaneceu. Então executei o rebasecomando dentro do terminal Cygwin64 e obtive um erro:

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

Mais tarde, tentei um endereço de casal, mas nenhum deles funcionou. Acabei alterando o msys-1.0.dllarquivo e resolvi o problema.

cabeça de rádio
fonte
1

Encontrei isso hoje. Liderado pela resposta de Greg Hewgill, observei os processos em execução no meu sistema para ver se alguma coisa estava "travada" ou se outros usuários estavam conectados à máquina fazendo algo com o git. Lancei o cygwin (instalado separadamente) nesta máquina em particular. Lançou ok. Fechei e tentei as extensões Git novamente (eu estava tentando uma operação pull) e funcionou. Não tenho certeza se o lançamento do cygwin limpou algo que foi compartilhado, mas esta é a primeira vez que encontrei esse erro e isso pareceu corrigi-lo.

P_O
fonte
1

Eu tive o mesmo problema, após algumas falhas e atualizações do Windows 8.0, no msys git 1.9. Não encontrei nenhum msys / git no caminho, apenas o adicionei nas configurações de ambiente do usuário local do Windows. Funcionou sem reiniciar.

Basicamente, semelhante ao RobertB, mas eu não tinha nenhum git / msys no meu caminho.

Btw:

  1. Tentei usar rebase -b blablabla msys.dll, mas o erro "ReBaseImage (msys-1.0.dll) falhou com o último erro = 6"

  2. se você precisar disso rapidamente e não tiver tempo para depurar, observei "Git Bash.vbs" no diretório Git, que inicia com êxito o bash shell.

Koshmaar
fonte
A mesma situação para mim. Falha ao reiniciar como administrador. Adicionado c:\Program Files (x86)\Git\binao caminho e agora estou dourado.
Jon Crowell
1

Este erro ocorre muito raramente na minha máquina Windows. Acabei reiniciando a máquina e o erro desapareceu.

IgorGanapolsky
fonte
0

Eu encontrei esse problema com o LPCEXpresso building.if você possui o C: \ MinGW \ bin no PATH. de alguma forma eu tive que removê-lo para me livrar desse problema, já que outros MinGW gostam também

Prashanjit Ghosh
fonte
0

Para corrigir esse problema, deixei o Tortoise Git instalar sua atualização.

Jace Browning
fonte
0

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

sebahattin çatal
fonte
0

A exclusão da versão antiga de% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx funcionou para mim. Não sei como ele foi conectado à linha de comando git ...

barbalion
fonte