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


342

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

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


5
Cygwin很奇怪,并且使用持久性共享内存部分。您是否尝试过重启系统?
2013年

@GregHewgill:几天以来没有重启。马上就做。
Uchia Itachi

1
@GregHewgill:解决了。谢谢,也许如果您将其发布为答案,也会对其他人有所帮助。
Uchia Itachi

只是想说这个错误不是特定于git的,在糟糕的日子,cygwin会以相同的方式在任何可执行文件上崩溃,而没有明显的原因。
meneldal 2015年

1
OP,您应该将选择的答案更改为@Yirkha的答案,因为那可以解决问题的根本原因。这可能会为将来的读者省去一些徒劳的尝试(就像我发生的那样)。
ysap

Answers:


230

Cygwin使用持久性共享内存段,该段有时可能会损坏。其症状是某些Cygwin程序开始失败,但其他应用程序不受影响。由于这些共享内存部分是持久性的,因此通常需要重新引导系统才能清除它们,然后才能解决问题。


万一它对任何人都有帮助,我将PATH中的GitExtensions位移到了第一位,这似乎为我解决了这个问题。(我把git / cmd放在第二位-不知道这是否是它的一部分)。比重新启动或.dll改组容易一些。
jinglesthula

6
没有可执行文件可以终止以释放内存吗?完全重新引导系统似乎有点过头了。另外,下面的回答(stackoverflow.com/a/31970708/88409)解释了问题的实质,它与损坏的内存无关。
Triynko

379

我有同样的问题。我在这里找到了解决方案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。

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


1
就我而言,我的rebase.exe位于/ mingw下的子目录中,因此该命令最终为:c:/ msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll,当我在c中运行它时: / msysgit / bin目录。
罗伯特·奥施勒

8
我git这个错误ReBaseImage(msys-1.0.dll)失败,最后一个错误= 6
TheJKFever

17
@TheJKFever您需要以管理员身份在命令提示符下运行它,因为它将修改msys-1.0.dll。首先对dll进行备份,将其复制到msys-1.0.dll.bak,然后以管理员身份运行命令。它为我工作。
Nikolaos Georgiou 2014年

1
Windows 8.1告诉我尝试重新设置基准时无法在此PC上运行此可执行文件
Jules GM

2
我在Win10 64位Pro上没有rebase.exe,但是调用以下命令就可以了(VS2010):“ C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe “ / REBASE:BASE = 0x50000000 msys-1.0.dll
PaulBußmann'17

136

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


为什么地址空间的那部分不空闲?

可能有很多原因。就我而言,这是在冲突的地址处加载了其他一些模块:

Process Explorer中的过程模块

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

只要有共享的DLL,Windows通常都会尝试在所有进程中将其加载到相同的虚拟地址,以节省一些重定位处理。不幸的是,这些系统组件这次以某种方式加载到了一个有冲突的地址。


为什么您的Git中存在Cygwin?

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

为此,人们发明了MinGW和MSYS-一套最小的构建工具,用于以类似Unix的方式在Windows上开发程序。MSYS还包含一个共享库,此msys-1.0.dll,它可以解决运行时两个平台之间的一些兼容性问题。而且其中很多部分都取自Cygwin,因为有人必须在那里解决相同的问题。

因此,这不是Cygwin,这是MinGW的运行时DLL引起的。

在Cygwin中,此代码实际上已发生了很大变化,因为MSYS 1.0中的内容已更改-该文件的最后一条提交消息为“ Import Cygwin 1.3.4”,这是从2001年开始的!

无论当前的CygwinMSYS的新版本 - MSYS2 -已经到位不同的逻辑,这是希望更稳健。这只是Git for Windows的旧版本,仍然使用旧的损坏的MSYS系统构建。


清洁解决方案:

  • 安装适用于Windows 2的Git-它是用正确维护的新MSYS2构建的,还具有许多新功能,大量错误修复,安全性改进等。如果可能的话,也建议使用64位版本。但是对于32位系统,在后台自动执行了变基解决方法,因此,在那里发生问题的机会也应该更低。
  • 只需重新启动计算机以清理地址空间(将这些模块加载到其他随机地址)可能会起作用,但实际上,只需升级到Windows 2的Git即可获得安全修复程序。

hacky解决方案:

  • 更改PATH有时可以起作用,因为msys-1.0.dll不同版本的Git或其他基于MSYS的应用程序中可能存在不同的版本,它们可能使用不同的地址,此堆的不同大小等。
  • 重新设置基准msys-1.0.dll可能会浪费时间,因为1)作为DLL,它已经具有重定位信息,以及2)“在任何版本的Windows OS中,都无法保证(...)DLL总是会在相同的地址空间加载”无论如何(来源)。唯一有帮助的方法是,如果msys-1.0.dll自身加载在要使用的冲突地址上。显然有时候是这样,因为Windows的Git正是在32位系统上自动执行的操作
  • 考虑到上述发现,我最初对二进制文件进行了修补,msys-1.0.dll以对二进制文件使用其他值,_cygheap_start然后立即解决了该问题。

1
感谢您的好奇评论!事实证明,它已经以一种或另一种方式修复了一段时间,并且正确的解决方案似乎是将Git用于基于MSYS2的Windows 2(以及更新的Cygwin代码)。
2015年

2
谢谢,很高兴知道。我正在使用git-extensions捆绑的版本,不管是什么。重新启动已修复它,因此我将忽略它,直到更新结束。:-)
蒂姆·阿贝尔2015年

3
完善的,有据可查的答案!并针对此问题找到适当的永久解决方案,而不是当前接受的答案。
索伦Boisen

2
关于这个问题的更多细节-github.com/git-for-windows/git/wiki/32-bit-issues
Kunal

1
Windows的x64 Git为我和cmder工作。谢谢!这一直让我发疯,尤其是与cmder一起工作时。我基本上将x64 Git文件夹复制到cmder/vendor/git-for-windows目录,并将旧文件夹重命名为git-for-windows-x86。如果打开cmder/vendor/git-for-windows,则会看到一个文件夹mingw32,这是使用32位的线索。在x64 Git中,您将看到一个文件夹mingw64
cmeza

32

变基解决方案的非常简单的验证:

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

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

通过按住shift键并右键单击该文件夹,您应该可以从此处以管理员身份打开命令提示符(感谢https://stackoverflow.com/users/35538​​9/darren-lewis的评论),

然后运行:

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

当重启方法不起作用时,这为我修复了该问题。

希望能帮助到你。


1
为我工作。只要确保您以管理员身份运行命令提示符即可。
达伦·刘易斯

这对我也有用,请注意,我不知道如何右键单击并将cmd.exe加载为admin,所以我从启动开始右键单击启动cmd.exe,然后选择以admin身份启动,然后进入目录,然后运行命令。有效!
edencorbin

13

升级到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

通过将Git路径C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\放在我的第一位%PATH%,错误消息消失了。

无需重新启动,甚至不需要更改DOS会话。
一旦%PATH%在该DOS会话中更新,git命令就可以使用。


请注意,carmbresterSixto Saez均报告以下(在评论中)必须重新启动才能解决此问题。
注意:首先,还要删除any msys-1.0.dll,例如in%LOCALAPPDATA%


1
我在路径中的其他任何地方都没有msys-1.0.dll,但是看起来您就在那儿-在列表中将路径的git部分移到更高的位置确实为我解决了问题。谢谢你!-厌倦了重新启动修复。
carmbrester 2014年

1
我的“额外” msys-1.0.DLL文件在C:\ Users \中,您的登录名 \ AppData \ Local来自另一个应用程序。删除该应用程序重新启动对我而言已解决了问题
Sixto Saez 2014年

@SixtoSaez有趣。我已经编辑了答案,使重新启动步骤更加明显。
VonC 2014年

可能还需要重新启动的用户才需
要这样做

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安装。)


重新启动并没有为我修复它!路径中确实有一些重复的条目。Tks很多。
Reginaldo Santos

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

尽管重新设置看起来很成功,但错误仍然存​​在。然后我rebase在Cygwin64终端中运行命令,并得到一个错误:

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

后来我尝试了几个地址,但都不起作用。所以我最终更改了msys-1.0.dll文件,它解决了问题。


1

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


1

在Windows 8.0崩溃和更新后,在msys git 1.9上,我遇到了同样的问题。我在路径中没有找到任何msys / git,因此我将其添加到Windows本地用户环境设置中。它没有重新启动就可以工作。

基本上,它类似于RobertB,但是我的路径中没有 git / msys。

顺便说一句:

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

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


我的情况也一样。重新设置为管理员失败。添加c:\Program Files (x86)\Git\bin到路径,现在我很高兴。
乔恩·克罗威尔


0

如果您在PATH中有C:\ MinGW \ bin,则我在LPCEXpresso building中遇到了此问题。我不得不删除它以摆脱这个问题,因为其他一些MinGW也基于




0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.