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

时间:2013-08-29 05:33:57

标签: git cygwin git-extensions

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

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

我克隆的所有存储库都在发生这种情况。 但是,我的 git bash 工作正常。 我不知道发生了什么。知道为什么会这样吗?

14 个答案:

答案 0 :(得分:376)

我遇到了同样的问题。我在这里找到了解决方案http://jakob.engbloms.se/archives/1403

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

对我而言,解决方案略有不同。这是

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

在你修改dll之前,你应该确保它没有被使用:

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. 用副本替换原始dll。
  4. 如果有任何问题,请按管理员

    运行命令

答案 1 :(得分:230)

Cygwin使用持久性共享内存部分,有时可能会损坏。这种情况的症状是一些Cygwin程序开始失败,但其他应用程序不受影响。由于这些共享内存部分是持久性的,因此在解决问题之前,通常需要系统重启来清除它们。

答案 2 :(得分:135)

tl; dr:安装64-bit Git for Windows 2

技术细节

      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为其堆分配大约5 MB的大块内存,而那里只有一个大约2.5 MB的大洞。相关代码可以在msysgit source中找到。

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

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

Process modules in Process explorer

最后一个地址大约是0x68570000 + 5 MB = 0x68C50000,但是这些与WOW64相关的DLL从0x68810000向上加载,这会阻止分配。

每当有一些共享DLL时,Windows通常会尝试将其加载到所有进程中的同一虚拟地址,以节省一些重定位处理。这次系统组件以某种方式加载到冲突的地址,这只是运气不好的问题

为什么你的Git中有Cygwin?

因为Git是一个由一些低级命令和许多有用的实用程序组成的丰富套件,并且主要是在类Unix系统上开发的。为了能够构建它并在没有大量重写的情况下运行它,它至少需要一个类似Unix的部分环境。

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

所以它不是Cygwin,它是MinGW的运行时DLL在这里表现得很奇怪。

在Cygwin中,这段代码实际上发生了很大变化,因为MSYS 1.0中的内容 - that file的最后一次提交消息是“Import Cygwin 1.3.4”,这是2001年的一次!

current Cygwinnew version of MSYS - MSYS2 - 已经有不同的逻辑,希望更强大。它只是旧版本的Git for Windows,它仍然使用旧的MSYS系统构建。

清洁解决方案:

  • 安装Git for Windows 2 - 它使用新的properly maintained MSYS2构建,并且还具有许多新功能,大量错误修复,安全性改进等。如果可能的话,还建议使用64位版本。但rebase workaround是在32位系统的幕后自动执行的,因此问题发生的可能性也应该降低。
  • 只需重新启动计算机以清理地址空间(在不同的随机地址加载这些模块)可能会有效,但实际上,只需升级到Git for Windows 2即可获得安全修复程序。

Hacky解决方案:

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

答案 3 :(得分:31)

rebase解决方案非常简单:

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

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

通过在文件夹中按住shift并右键单击,您应该可以从那里以管理员身份打开命令提示符(感谢https://stackoverflow.com/users/355389/darren-lewis注释),

然后运行:

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

当重启方法不起作用时,这对我来说是固定的。

希望它有所帮助。

答案 4 :(得分:12)

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

只需搜索msys-1.0.dll驱动器上的所有C:\,然后将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

通过在我的C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\中首先显示Git路径%PATH%,错误消息消失了。

无需重启或甚至更改DOS会话 在该DOS会话中更新%PATH%后,git命令就可以正常工作。


请注意,carmbresterSixto Saez会在下面(在评论中)报告重新启动以解决问题。
注意:首先,同时删除任何msys-1.0.dll,例如%LOCALAPPDATA%

中的{{1}}

答案 5 :(得分:7)

如果重新启动无法解决问题(如Greg Hegwill的回答所示),请检查您的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。)

临时修复是将Git的bin目录添加到PATH,以便它出现在MinGW的路径之前。 (一个更永久的修复可能涉及整理MinGW的msys和Git之间的路径冲突和/或删除重复的msys安装。)

答案 6 :(得分:2)

只想在这里分享我的经验。我在Windows 64位计算机上为MTK平台进行交叉编译时遇到了同样的问题。 MinGW和MSYS参与了构建过程,并且出现了这个问题。我通过更改msys-1.0.dll文件解决了这个问题。 rebase.exe和系统重启都不适合我。

由于我的计算机上没有安装rebase.exe。我安装了cygwin64并在里面使用了rebase.exe

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

虽然看起来成功,但错误仍然存​​在。然后我在Cygwin64终端内运行rebase命令并收到错误:

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

我后来尝试了几个地址,但他们都没有工作。所以我最终更改了msys-1.0.dll文件并解决了问题。

答案 7 :(得分:1)

我今天遇到了这个。在Greg Hewgill的回答的带领下,我查看了系统上正在运行的进程,看看是否有任何问题被困在了#34;或者如果其他用户使用git登录到机器上做任何事情。然后我在这台特定的机器上启动了cygwin(单独安装)。它启动好了。我关闭它然后再次尝试Git Extensions(我正在尝试拉动操作)并且它有效。不确定cygwin的启动是否清除了共享的内容,但这是我第一次遇到此错误,这似乎为我解决了这个问题。

答案 8 :(得分:1)

在msys git 1.9上发生一些Windows 8.0崩溃和更新之后,我遇到了同样的问题。我在路径中找不到任何msys / git,所以我只是在windows local-user envinroment设置中添加了它。它没有重新启动。

基本上,与RobertB类似,但我的路径中没有任何 git / msys。

顺便说一下:

  1. 我尝试使用rebase -b blablabla msys.dll,但出现错误&#34; ReBaseImage(msys-1.0.dll)失败,最后一次错误= 6&#34;

  2. 如果您需要快速调试并且没有时间调试,我注意到了#34; Git Bash.vbs&#34;在Git目录中成功启动bash shell。

答案 9 :(得分:1)

在我的Windows计算机上很少发生此错误。我最终重启了机器,错误就消失了。

答案 10 :(得分:0)

我在LPCXpresso建筑中遇到过这个问题。如果你在PATH中有C:\ MinGW \ bin。不知何故,我不得不删除它以摆脱这个问题,因为其他一些MinGW也喜欢基于

答案 11 :(得分:0)

要解决此问题,我只需让Tortoise Git安装其更新。

答案 12 :(得分:0)

c:\ msysgit \ bin&gt; rebase.exe -b 0x50000000 msys-1.0.dll

答案 13 :(得分:0)

删除旧版本的%USERPROFILE%\ AppData \ Local \ SourceTree \ app-x.x.x对我有用。不确定它是如何连接到命令行git ...