web-dev-qa-db-ja.com

Git Extensions:Win32エラー487:cygwinのヒープ用のスペースを確保できませんでした、Win32エラー

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 は正常に動作しています。何が起こっているのかわかりません。なぜこれが起こっているのかについて何か考えはありますか?

339
Uchia Itachi

Cygwinは機会に破損することができます永続的な共有メモリセクションを、使用しています。この症状は、いくつかのCygwinのプログラムが失敗し始めるということですが、他のアプリケーションは影響を受けません。これらの共有メモリセクションは永続的なので、問題を解決する前に システムの再起動 を実行してそれらを消去する必要があります。

230
Greg Hewgill

私は同じ問題を抱えていました。私はここで解決策を見つけました 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をコピーと交換してください。

問題がある場合は、 Administrator のようにコマンドを実行してください。

376
zainengineer

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 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という共有ライブラリも含まれています。これは、実行時の2つのプラットフォーム間の互換性の問題を解決するのに役立ちます。そしてそれの多くの部分はCygwinから取られました、なぜなら誰かがすでに同じ問題をそこで解決しなければならなかったからです。

だからCygwinじゃない、MinGWのランタイムDLLが奇妙な振る舞いをするのはここだ。

Cygwinでは、このコードは実際にはMSYS 1.0から何度も大きく変更されました。これは、 そのファイル と言うのは2001年からの "Import Cygwin 1.3.4"です。

現在のCygwin新しいバージョンのMSYS - MSYS2 - はすでに別のロジックを持っていますが、これはより堅牢です。古いバージョンのGit for Windowsのみを使用してビルドされたものです。 MSYSシステム.


きれいな解決策:

  • Git for Windows 2 - これは、新しい MSYS2 を適切に管理)で構築されていて、多くの新機能、たくさんのバグ修正、セキュリティの改善などを持っています。 64ビットバージョンを使用することをお勧めします 。しかし、 rebase回避策 は32ビットシステムでは舞台裏で自動的に実行されるため、問題が発生する可能性も低くなるはずです。
  • アドレス空間をきれいにするためにコンピュータを再起動する(これらのモジュールを異なるランダムなアドレスでロードする)だけでもうまくいくかもしれませんが、実際には、Git for Windows 2にアップグレードしてセキュリティの問題を解決します。

ハッキーな解決策:

  • 異なるバージョンのGitまたは他のMSYSベースのアプリケーションでは、異なるバージョンのmsys-1.0.dllがある可能性があるため、PATHを変更してもうまくいくことがあります。
  • msys-1.0.dllをリ​​ベースすることは時間の無駄になるかもしれません、なぜなら1)はDLLであり、それはすでにリロケーション情報を持っていて、2) "Windows OSのどのバージョンでも(...)DLLが常にロードされる保証はないとにかく( source )。これが役立つ唯一の方法は、msys-1.0.dll自体が競合アドレスでロードされている場合に使用することです。これは、Git for Windowsの場合と同様です。みんな 32ビットシステム で自動的にやっています。
  • 上記の調査結果を考慮して、私はもともとmsys-1.0.dllバイナリに_cygheap_startの別の値を使用するようにバイナリパッチを適用し、それが問題をすぐに解決しました。
135
Yirkha

リベースソリューションの非常に簡単な検証:

以下のように、gitがインストールされているフォルダに移動します。

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

Shiftキーを押しながらフォルダを右クリックすると、そこから管理者としてプロンプトコマンドを開くことができるはずです(そのおかげで https://stackoverflow.com/users/35538​​9/darren-lewis に感謝)

次に実行します。

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

再起動のアプローチがうまくいかなかったとき、これは私のためにそれを修正しました。

それが役に立てば幸い。

31
Tisch

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セッションを変更したりする必要はありません。
そのDOSセッションで%PATH%が更新されると、gitコマンドは動作します。


carmbresterSixto Saez の両方が、問題を解決するために reboot をしなければならないことを以下に報告します(コメント内)。
注:まず、msys-1.0.dll内のもののように、すべての%LOCALAPPDATA%も削除します。

12
VonC

再起動しても問題が解決しない場合(Greg Hegwillの回答で示唆されているように)、PATHでmsys-1.0.dll(およびおそらく他の関連DLL)の競合するインストールを確認してください。

私の特定の状況では、MinGWのmsysのインストールでは、そのDLLのコピーがそのbinディレクトリ(<MinGW_Install_Path>\msys\1.0\bin)にあり、それがPATHにリストされていました。 GitのcmdディレクトリはPATHにリストされていましたが、そのbinはリストされていませんでした。 (Gitのバージョンのmsys-1.0.dllはbinディレクトリにあります。明らかにMSys-GitのデフォルトインストールはそのbinをPATHに追加しません。)

一時的な修正は、GitのbinディレクトリをPATHに追加して、MinGWのパスの前に表示されるようにすることでした。 (もっと恒久的な修正には、おそらくMinGWのmsysとGitの間のパスの衝突を整理したり、重複したmsysインストールを削除することが含まれるでしょう。)

7
RobertB

ここで私の経験を共有したいと思います。 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ファイルを変更することになった、そしてそれは問題を解決した。

2
radiohead

私は今日これに遭遇した。 Greg Hewgillの答えに導かれて、私は自分のシステムで実行中のプロセスを調べて、何かが「動かなくなった」かどうか、または他のユーザーがgitを使ってマシンにログインしているかどうか調べました。それから私はこの特定のマシン上でcygwin(別々にインストールされた)を立ち上げました。それはうまく起動しました。私はそれを閉じてからGit Extensionsをもう一度試してみました(私はpull操作を試みていました)そしてそれはうまくいきました。 cygwinの起動によって共有されたものがクリアされたかどうかはわかりませんが、これが私がこのエラーに遭遇したのは初めてのことで、これは私のために修正したようです。

1
P_O

このエラーは私のWindowsマシンではめったに起こりません。私はマシンを再起動することになった、そしてエラーは消えた。

1
IgorGanapolsky

私はいくつかのWindows 8.0のクラッシュとアップデートの後、msys git 1.9で同じ問題を抱えていた。自分のパスにmsys/gitが見つからなかったので、windows local-user envinroment設定に追加しました。再起動せずに動作しました。

基本的には、RobertBに似ていますが、 any git/msysは私のパスにありませんでした。

ところで:

  1. Rebase -b blablabla msys.dllを使用しようとしましたが、 "ReBaseImage(msys-1.0.dll)に失敗しました"というエラーが発生しました= 6

  2. あなたがこれをすぐに必要とし、デバッグ時間がないならば、私はGitディレクトリの "Git Bash.vbs"がbashシェルを正常に起動することに気づきました。

1
Koshmaar

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

0

%USERPROFILE%\ AppData\Local\SourceTree\app-x.x.xの古いバージョンを削除しても問題ありません。それがどのようにコマンドラインgitに接続されたかわからない...

0
barbalion

私はあなたがPATHにC:\ MinGW\binがあるならLPCXpresso building.ifでこの問題に遭遇しました。他のMinGWもベースを好むので、どういうわけか私はこの問題を取り除くためにそれを削除しなければならなかった

0

この問題を解決するために、私はTortoise Gitにそのアップデートをインストールさせるだけです。

0
Jace Browning