Git扩展:Win32错误487:无法为cygwin的堆保留空间,Win32错误0

Git扩展:直到昨天,一切正常。

但是,当我尝试使用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 

这是所有我已经克隆的存储库正在发生。 但是,我的混帐bash工作正常。 我不知道发生了什么事。 任何想法,为什么发生这种情况?

Cygwin使用永久共享内存段,有时可能会损坏。 这样的症状是一些Cygwin程序开始失败,但其他应用程序不受影响。 由于这些共享内存部分是持久的,因此在问题得到解决之前,通常需要重新启动系统才能将其清除。

我有同样的问题。 我在这里find解决schemehttp://jakob.engbloms.se/archives/1403

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

对我来说,解决scheme略有不同。 它是

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

在重新构builddll之前,您应该确保它没有被使用:

 tasklist /m msys-1.0.dll 

做一个备份:

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

如果rebase命令失败,如下所示:

ReBaseImage(msys-1.0.dll)失败,最后一个错误= 6

您将需要按顺序执行以下步骤:

  1. 将dll复制到另一个目录
  2. 使用上述命令重新复制副本
  3. 用原件replace原来的dll。

如果有任何问题以pipe理员身份运行命令

tl; dr: 为Windows 2安装64位Git 。


技术细节

  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 

这个症状本身与可执行文件的映像基础无关,Cygwin的共享内存段损坏,DLL的冲突版本等。

这是Cygwin代码在这个固定的地址0x68570000处没有为它的堆分配一个〜5MB的大块内存,而在那里只有一个〜2.5MB大的空洞。 相关代码可以在msysgit源文件中看到。


为什么这部分地址空间不是免费的?

可以有很多原因。 在我的情况下,这是一些其他模块加载在一个冲突的地址:

进程管理器中的进程模块

最后的地址大概是0x68570000 + 5 MB = 0x68C50000,但是这些与WOW64相关的DLL从0x68810000向上装载,阻塞了分配。

只要有一些共享DLL,Windows一般会尝试在所有进程中的相同虚拟地址加载它,以节省一些重定位处理。 这些系统组件在某个冲突的地址被加载,这只是一个运气不好的问题。


为什么你的Git中有Cygwin?

因为Git是一个丰富的套件,它由一些低级别的命令和许多有用的工具组成,而且主要是在类Unix系统上开发的。 为了能够构build并运行而不需要大规模的重写,它至less需要一个类Unix环境。

为了达到这个目的,人们发明了MinGW和MSYS,这是一种最小的构build工具,用于在Unix上开发Windows程序。 MSYS还包含一个共享库,这个msys-1.0.dll可以帮助解决运行时两个平台之间的一些兼容性问题。 其中很多部分都是从Cygwin那里拿走的,因为有人已经在那里解决了同样的问题。

所以这不是Cygwin,它是MinGW的运行时DLL,这里有什么奇怪的。

在Cygwin中,这个代码实际上已经发生了很大的变化,因为MSYS 1.0中的最后一个提交信息是2001年的“Import Cygwin 1.3.4”!

目前的Cygwin和新版本的MSYS – MSYS2 – 已经有了不同的逻辑,希望更强大。 这只是老版本的Git for Windows,它仍然使用旧的MSYS系统构build而成。


清洁scheme:

  • 安装Git for Windows 2 – 它是使用新的, 正确维护的MSYS2构build的,并且还有许多新function,大量的错误修复,安全性改进等等。 如果可能,还build议使用64位版本 。 但是,基础架构变通办法是在32位系统的幕后自动执行的,因此发生问题的机会也应该较低。
  • 只需重新启动计算机来清理地址空间(以不同的随机地址加载这些模块)可能会起作用,但实际上,只需升级到Windows 2的Git即可获得安全修补程序。

Hacky解决scheme:

  • 更改PATH有时可以工作,因为在不同版本的Git或其他基于MSYS的应用程序(可能使用不同的地址,不同的堆大小)中可能有不同版本的msys-1.0.dll
  • 重新启动msys-1.0.dll可能是浪费时间,因为1)是一个DLL,它已经有重定位信息和2)“在任何版本的Windows操作系统中,不保证一个(…)DLL将始终加载在相同的地址空间“无论如何( 来源 )。 唯一的方法可以帮助是如果msys-1.0.dll本身加载在冲突的地址然后尝试使用。 显然,情况就是这样,因为这是Git for Windows家伙在32位系统上自动执行的。
  • 考虑到上述发现,我最初二进制修补了msys-1.0.dll二进制文件,为_cygheap_start使用了一个不同的值,并立即解决了这个问题。

非常简单的rebase解决scheme版本:

转到安装git的文件夹,例如:

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

通过按住Shift并右键单击文件夹,您应该能够以pipe理员身份打开命令提示符(对于该注释,请参阅https://stackoverflow.com/users/35538​​9/darren-lewis ),

然后运行:

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

这在重新启动方法无效时为我解决了。

希望它有帮助。

升级到git1.8.5.2后,我看到了同样的错误信息:

只需在C:\驱动器上search所有msys-1.0.dll ,然后使Git使用的那个。

例如,在我的情况下,我只是改变了顺序:

 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 

通过使GitpathC:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\首先在我的%PATH% ,错误消息消失。

无需重启或甚至更改DOS会话。
一旦在DOS会话中更新了%PATH% ,git命令就可以工作。


请注意, carmbrester和Sixto Saez都报告下面(在评论中)必须重新启动才能解决问题。
注意:首先,删除任何msys-1.0.dll ,就像%LOCALAPPDATA%

如果重新启动不能解决问题(正如Greg Hegwill的回答所build议的那样),请检查您的PATH是否有冲突的msys-1.0.dll安装(以及其他相关的DLL)。

在我的特殊情况下,MinGW安装的msys在其bin目录( <MinGW_Install_Path>\msys\1.0\bin )中有一个该DLL的副本,并在PATH中列出。 Git的cmd目录在PATH中列出,但是它的bin不是。 (Git的msys-1.0.dll版本位于bin目录中,显然MSys-Git的默认安装不会将其bin添加到PATH中。)

一个临时的解决scheme是将Git的bin目录添加到PATH中,以便它显示在MinGW的path之前。 (一个更持久的修复可能会涉及整理MinGW的msys和Git之间的path冲突和/或删除重复的msys安装。)

我今天遇到了这个。 在Greg Hewgill的回答的带领下,我查看了系统上正在运行的进程,看是否有任何东西“卡住”,或者其他用户是否使用gitlogin了机器。 然后我在这个特定的机器上启动了cygwin(单独安装)。 它启动了。 我closures它,然后再次尝试Git扩展(我正在尝试拉操作),它的工作。 不知道是否启动cygwin清除了共享的东西,但这是我第一次遇到这个错误,这似乎为我解决了这个问题。

在msys git 1.9上发生Windows 8.0崩溃和更新后,我遇到了同样的问题。 我没有在我的path中find任何msys / git,所以我只是在Windows本地用户envinroment设置中添加它。 它工作无需重新启动。

基本上,类似于RobertB,但我没有任何 git / msys在我的path。

BTW:

  1. 我试图使用rebase -b blablabla msys.dll,但有错误“ReBaseImage(msys-1.0.dll)失败,最后一个错误= 6”

  2. 如果你需要这个,而且没有时间debugging,我注意到Git目录中的“Git Bash.vbs”成功启动了bash shell。

这个错误在我的Windows机器上很less发生。 我结束了重新启动机器,错误消失了。

我在LPCEXpresso building的时候遇到过这个问题,如果你在PATH中有C:\ MinGW \ bin。 不知何故,我不得不删除它,以摆脱这个问题,因为其他一些MinGW喜欢也是如此

为了解决这个问题,我只是让Tortoise Git安装它的更新。

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