技術的な詳細
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の大きなメモリチャンクを割り当てることができません。関連するコードはmsysgit sourceで見ることができます。
なぜアドレス空間のその部分が解放されないのですか?
多くの理由が考えられます。私の場合、競合するアドレスでロードされた他のいくつかのモジュールでした:
最後のアドレスは約0x68570000 + 5 MB = 0x68C50000ですが、これらのWOW64関連DLLが0x68810000以上からロードされ、割り当てをブロックしています。
共有DLLがある場合は常に、Windowsは通常、すべてのプロセスで同じ仮想アドレスにそれをロードして、再配置処理を節約しようとします。これは、これらのシステムコンポーネントが何らかの形で競合したアドレスにロードされてしまったという不運の問題だ、この時間を。
なぜあなたのGitにCygwinがあるのですか?
Gitは、いくつかの低レベルのコマンドと多くの便利なユーティリティで構成されるリッチスイートであり、ほとんどがUnixライクなシステムで開発されているためです。大規模な書き換えをせずにビルドして実行できるようにするには、少なくとも部分的にUnixに似た環境が必要です。
それを実現するために、人々はMinGWとMSYSを発明しました。これは、Unixのような方法でWindowsでプログラムを開発するための最小限のビルドツールセットです。MSYSには、共有ライブラリthisも含まれています。これはmsys-1.0.dll
、実行時の2つのプラットフォーム間の互換性の問題の一部に役立ちます。そして、誰かが既に同じ問題を解決しなければならなかったので、その多くの部分はCygwinから取られました。
したがって、Cygwinではなく、ここで動作がおかしいのはMinGWのランタイムDLLです。
Cygwinでは、このコードはMSYS 1.0の内容以降、実際に大幅に変更されています。そのファイルの最後のコミットメッセージは、2001年からの「Import Cygwin 1.3.4」です。
どちらも現在のCygwinやMSYSの新バージョン - MSYS2は-すでにうまくいけば、より堅牢である場所で異なるロジックを持っています。古い壊れたMSYSシステムを使用してビルドされたのは、Git for Windowsの古いバージョンのみです。
クリーンなソリューション:
- Git for Windows 2をインストールします。これは、適切にメンテナンスされた新しいMSYS2で構築されており、多くの新機能、多くのバグ修正、セキュリティの改善なども備えています。可能であれば、64ビットバージョンを使用することもお勧めします。ただし、リベースの回避策は32ビットシステムのバックグラウンドで自動的に実行されるため、問題が発生する可能性も低くなります。
- コンピューターを再起動してアドレススペースをクリーンアップする(これらのモジュールを別のランダムアドレスでロードする)だけでうまくいくかもしれませんが、実際には、Git for Windows 2にアップグレードして、セキュリティ修正を入手するだけです。
ハッキーソリューション:
- 異なるバージョンのGitまたは他のMSYSベースのアプリケーションに
PATH
異なるバージョンのが存在する可能性があるため、変更が機能することがありmsys-1.0.dll
ます。これは、異なるアドレス、このヒープの異なるサイズなどを使用している可能性があります。
msys-1.0.dll
1)DLLであり、すでに再配置情報があり、2)「Windows OSのどのバージョンでも、(...)DLLが常に同じアドレス空間でロードされるという保証はない」ため、リベースは時間の浪費になる可能性があります。とにかく(ソース)。これが役立つ唯一の方法は、msys-1.0.dll
それ自体が競合するアドレスでロードされ、使用しようとすることです。これは、32ビットシステムでWindowsのGitが自動的に実行していることです。
- 上記の調査結果を考慮して、私は元々、
msys-1.0.dll
バイナリに別の値を使用するようにパッチを適用し_cygheap_start
、問題をすぐに解決しました。