Tiện ích mở rộng Git: Lỗi Win32 487: Không thể dành chỗ cho heap của Cygwin, lỗi Win32 0


342

Phần mở rộng Git: Mọi thứ đã hoạt động tốt cho đến ngày hôm qua.

Nhưng đột nhiên tôi gặp lỗi này khi tôi cố gắng kéo một số kho lưu trữ bằng cách sử dụng 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

Nó đang xảy ra cho tất cả các kho lưu trữ mà tôi đã nhân bản. Nhưng, git bash của tôi đang hoạt động tốt. Tôi không biết chuyện gì đang xảy ra. Bất cứ ý tưởng như tại sao điều này đang xảy ra?


5
Cygwin là lạ và sử dụng các phần bộ nhớ chia sẻ liên tục. Bạn đã thử khởi động lại hệ thống của bạn?
Greg Hewgill

@GregHewgill: Không được khởi động lại sau vài ngày. Sẽ làm điều đó ngay lập tức.
Uchia Itachi

1
@GregHewgill: Nó hoạt động được. Cảm ơn, có lẽ nếu bạn đăng nó như một câu trả lời, nó cũng sẽ hữu ích cho những người khác.
Uchia Itachi

Chỉ muốn nói rằng lỗi này không cụ thể đối với git và vào những ngày xấu Cygwin sẽ gặp sự cố với bất kỳ thực thi nào theo cùng một cách mà không có lý do rõ ràng.
meneldal

1
OP, bạn nên thay đổi câu trả lời đã chọn thành câu trả lời của @ Yirkha, vì câu trả lời đó giải quyết được nguyên nhân gốc rễ của vấn đề. Nó có thể lưu một số nỗ lực vô ích đối với các độc giả tương lai (như đã xảy ra với tôi).
ysap

Câu trả lời:


230

Cygwin sử dụng các phần bộ nhớ chia sẻ liên tục, đôi khi có thể bị hỏng. Triệu chứng của điều này là một số chương trình Cygwin bắt đầu bị lỗi, nhưng các ứng dụng khác không bị ảnh hưởng. Vì các phần bộ nhớ dùng chung này là liên tục, nên thường cần khởi động lại hệ thống để xóa chúng trước khi vấn đề có thể được giải quyết.


Trong trường hợp nó giúp được bất cứ ai, tôi đã chuyển bit GitExtensions trong PATH của mình thành mục đầu tiên và dường như nó đã giải quyết được vấn đề cho tôi. (Tôi đặt git / cmd thứ 2 - không chắc đó có phải là một phần của nó không). Dễ dàng hơn một chút so với khởi động lại hoặc xáo trộn.
jinglểula

6
Không có một thực thi nào có thể bị chấm dứt để giải phóng bộ nhớ? Khởi động lại toàn bộ hệ thống có vẻ như quá mức cần thiết. Ngoài ra, một câu trả lời dưới đây ( stackoverflow.com/a/31970708/88409 ) giải thích vấn đề thực sự là gì và nó không liên quan gì đến bộ nhớ bị hỏng.
Triynko

379

Tôi đã từng gặp vấn đề tương tự. Tôi tìm thấy giải pháp ở đây http://jakob.engbloms.se/archives/1403

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

Đối với tôi giải pháp là hơi khác nhau. Đó là

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

Trước khi bạn rebase dlls, bạn nên chắc chắn rằng nó không được sử dụng:

tasklist /m msys-1.0.dll

tạo một bản sao lưu:

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

Nếu lệnh rebase thất bại với một cái gì đó như:

ReBaseImage (msys-1.0.dll) không thành công với lỗi cuối = 6

Bạn sẽ cần thực hiện các bước sau theo thứ tự:

  1. Sao chép dll vào thư mục khác
  2. Khởi động lại bản sao bằng các lệnh trên
  3. Thay dll gốc bằng bản sao.

Nếu bất kỳ vấn đề nào chạy các lệnh như Quản trị viên


1
Trong trường hợp của tôi, tôi rebase.exe nằm trong thư mục con bên dưới / mingw nên lệnh cuối cùng là: c: / msysgit / mingw / bin / rebase -b 0x50000000 msys-1.0.dll và tôi đã chạy nó trong khi nằm trong c: / msysgit / thư mục bin.
Robert Oschler

8
Tôi git lỗi này ReBaseImage (msys-1.0.dll) không thành công với lỗi cuối = 6
TheJKFever

17
@TheJKFever bạn cần chạy nó trong dấu nhắc lệnh với tư cách Quản trị viên, vì nó sẽ sửa đổi msys-1.0.dll. Tạo bản sao lưu của dll trước, sao chép nó vào msys-1.0.dll.bak, sau đó chạy lệnh với tư cách Quản trị viên. Nó làm việc cho tôi.
Nikolaos Georgiou

1
windows 8.1 cho tôi biết tôi không thể chạy chương trình thực thi này trên máy tính này khi tôi cố gắng khởi động lại
Jules GM

2
Tôi không có rebase.exe trên Win10 64 Bit Pro của mình, nhưng việc gọi như sau đã thực hiện thủ thuật (VS2010): "C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ editbin.exe "/ REBASE: BASE = 0x50000000 msys-1.0.dll
Paul Bußmann

136

tl; dr: Cài đặt Git 64 bit cho Windows 2 .


Chi tiết kỹ thuật

      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

Bản thân triệu chứng này không liên quan gì đến các cơ sở hình ảnh của các tệp thực thi, các phần bộ nhớ dùng chung của Cygwin bị hỏng, các phiên bản mâu thuẫn của DLL, v.v.

Đó là mã Cygwin không cấp phát một khối bộ nhớ lớn ~ 5 MB cho heap của nó tại địa chỉ cố định 0x68570000 này, trong khi chỉ có một lỗ lớn ~ 2,5 MB có sẵn ở đó. Các mã có liên quan có thể được nhìn thấy trong nguồn msysgit .


Tại sao một phần của không gian địa chỉ không miễn phí?

Có thể có nhiều lý do. Trong trường hợp của tôi, đó là một số mô-đun khác được tải tại một địa chỉ xung đột:

Các mô-đun xử lý trong Process explorer

Địa chỉ cuối cùng sẽ vào khoảng 0x68570000 + 5 MB = 0x68C50000, nhưng có những DLL liên quan đến WOW64 được tải từ 0x68810000 trở lên, chặn phân bổ.

Bất cứ khi nào có một số DLL được chia sẻ, Windows nói chung sẽ cố gắng tải nó tại cùng một địa chỉ ảo trong tất cả các quy trình để lưu một số xử lý di dời. Đây chỉ là một vấn đề xui xẻo khi các thành phần hệ thống này được tải bằng cách nào đó tại một địa chỉ xung đột lần này .


Tại sao có Cygwin trong Git của bạn?

Bởi vì Git là một bộ phần mềm phong phú bao gồm một số lệnh cấp thấp và rất nhiều tiện ích hữu ích và chủ yếu được phát triển trên các hệ thống giống như Unix. Để có thể xây dựng nó và chạy nó mà không cần viết lại lớn, nó cần ít nhất một môi trường giống như một phần Unix.

Để thực hiện điều đó, mọi người đã phát minh ra MinGW và MSYS - một bộ công cụ xây dựng tối thiểu để phát triển các chương trình trên Windows theo kiểu Unix. MSYS cũng chứa một thư viện chia sẻ, cái nàymsys-1.0.dll giúp giải quyết một số vấn đề tương thích giữa hai nền tảng trong thời gian chạy. Và nhiều phần trong số đó đã được lấy từ Cygwin, bởi vì ai đó đã phải giải quyết những vấn đề tương tự ở đó.

Vậy đó không phải Cygwin, đó là DLL thời gian chạy của MinGW, những thứ hành xử kỳ lạ ở đây.

Trong Cygwin, mã này thực sự đã thay đổi rất nhiều kể từ những gì trong MSYS 1.0 - thông báo cam kết cuối cùng cho tệp đó "Nhập Cygwin 1.3.4", từ năm 2001!

Cả Cygwin hiện tạiphiên bản mới của MSYS - MSYS2 - đã có logic khác nhau, hy vọng sẽ mạnh mẽ hơn. Đây chỉ là phiên bản cũ của Git cho Windows vẫn được xây dựng bằng hệ thống MSYS cũ bị hỏng.


Giải pháp sạch:

  • Cài đặt Git cho Windows 2 - nó được xây dựng với MSYS2 mới, được bảo trì đúng cách và cũng có nhiều tính năng mới, nhiều sửa lỗi, cải tiến bảo mật, v.v. Nếu có thể, cũng nên sử dụng phiên bản 64 bit . Nhưng cách giải quyết rebase được thực hiện tự động phía sau hậu trường cho các hệ thống 32 bit, do đó, khả năng xảy ra sự cố cũng sẽ thấp hơn.
  • Chỉ cần khởi động lại máy tính để dọn sạch không gian địa chỉ (tải các mô-đun này ở một địa chỉ ngẫu nhiên khác) có thể hoạt động, nhưng thực sự, chỉ cần nâng cấp lên Git cho Windows 2 để sửa lỗi bảo mật nếu không có gì khác.

Giải pháp mạnh mẽ:

  • Việc thay đổi PATHđôi khi có thể hoạt động vì có thể có các phiên bản khác nhau msys-1.0.dlltrong các phiên bản khác nhau của Git hoặc các ứng dụng dựa trên MSYS khác, có thể sử dụng địa chỉ khác nhau, kích thước khác nhau của heap này, v.v.
  • Việc khởi động lại msys-1.0.dllcó thể gây lãng phí thời gian, bởi vì 1) là một DLL, nó đã có thông tin di dời và 2) "trong bất kỳ phiên bản Windows OS nào, không có gì đảm bảo rằng (...) DLL sẽ luôn tải ở cùng một không gian địa chỉ" dù sao ( nguồn ). Cách duy nhất điều này có thể giúp là nếu msys-1.0.dllchính nó tải tại địa chỉ xung đột thì nó sẽ cố gắng sử dụng. Rõ ràng đôi khi đó là trường hợp, vì đây là điều mà các Git cho Windows đang thực hiện tự động trên các hệ thống 32 bit .
  • Xem xét những phát hiện ở trên, ban đầu tôi đã vá msys-1.0.dllnhị phân để sử dụng một giá trị khác _cygheap_startvà điều đó đã giải quyết vấn đề ngay lập tức.

1
Cảm ơn bạn đã bình luận tò mò của bạn! Hóa ra nó đã được sửa bằng cách này hay cách khác trong một thời gian khá lâu và giải pháp thích hợp dường như là sử dụng Git cho Windows 2 được xây dựng trên MSYS2 (và do đó là mã Cygwin gần đây).
Yirkha

2
Cảm ơn, tốt để biết. Tôi đang sử dụng phiên bản đi kèm với phần mở rộng git, bất kể đó là gì. Khởi động lại đã sửa nó vì vậy tôi sẽ bỏ qua nó cho đến khi bản cập nhật đến với tôi. :-)
Tim Abell

3
Hoàn hảo, tài liệu tốt câu trả lời! Và một giải pháp lâu dài thích hợp cho vấn đề thay vì câu trả lời hiện được chấp nhận.
Søren Boisen

2
Chi tiết hơn một chút về vấn đề - github.com/git-for-windows/git/wiki/32-bit-issues
Kunal

1
x64 Git cho các cửa sổ làm việc cho tôi và cmder. Cảm ơn bạn! Nó đã khiến tôi phát điên, đặc biệt là làm việc với cmder. Về cơ bản, tôi đã sao chép thư mục G64 x64 vào thư mục cmder/vendor/git-for-windowsvà đổi tên thư mục cũ thành git-for-windows-x86. Nếu bạn mở cmder/vendor/git-for-windows, bạn sẽ thấy một thư mục mingw32, đó là đầu mối của bạn đang sử dụng 32 bit. Trong x64 Git, bạn sẽ thấy một thư mục mingw64.
cmeza

32

Bản án rất đơn giản của giải pháp rebase:

Chuyển đến thư mục cài đặt git, chẳng hạn như:

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

Bằng cách giữ shift và nhấp chuột phải vào thư mục, bạn sẽ có thể mở một dấu nhắc lệnh với tư cách quản trị viên từ đó (cảm ơn https://stackoverflow.com/users/355389/darren-lewis cho nhận xét đó),

Sau đó chạy:

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

Điều này đã sửa nó cho tôi khi phương pháp khởi động lại không hoạt động.

Hy vọng nó giúp.


1
Đã làm cho tôi. Chỉ cần đảm bảo rằng bạn chạy dấu nhắc lệnh với tư cách Quản trị viên.
Darren Lewis

Điều này cũng có tác dụng với tôi, như một lưu ý, tôi không biết làm thế nào bạn có thể thay đổi nhấp chuột phải và tải cmd.exe với tư cách quản trị viên, vì vậy tôi đã khởi chạy cmd.exe nhấp chuột phải từ bắt đầu chọn bắt đầu với tư cách quản trị viên, sau đó cd vào thư mục, sau đó chạy lệnh. Nó đã làm việc!
edencorbin

13

Tôi đã thấy thông báo lỗi tương tự sau khi nâng cấp lên git1.8.5.2:

Chỉ cần thực hiện tìm kiếm tất cả msys-1.0.dlltrên C:\ổ đĩa của bạn và làm cho cái được Git sử dụng xuất hiện trước.

Chẳng hạn, trong trường hợp của tôi, tôi chỉ cần thay đổi thứ tự:

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

Bằng cách làm cho đường dẫn Git C:\prgs\git\PortableGit-1.8.5.2-preview20131230\bin\xuất hiện đầu tiên trong tôi %PATH%, thông báo lỗi biến mất.

Không cần phải khởi động lại hoặc thậm chí thay đổi phiên DOS.
Khi %PATH%được cập nhật trong phiên DOS đó, các lệnh git sẽ hoạt động.


Lưu ý rằng cả carmbresterSixto Saez đều báo cáo bên dưới (trong phần bình luận) phải khởi động lại để khắc phục sự cố.
Lưu ý: Đầu tiên, cũng loại bỏ bất kỳ msys-1.0.dll, như một trong%LOCALAPPDATA%


1
Tôi không có msys-1.0.dll ở bất kỳ nơi nào khác trên đường đi của tôi, nhưng có vẻ như bạn đã đúng về điều gì đó ở đó - di chuyển phần git của đường dẫn của tôi lên cao hơn trong danh sách đã giải quyết vấn đề cho tôi. Cảm ơn vì điều đó! - quá mệt mỏi với việc khởi động lại để sửa chữa.
carmbrester

1
Các tệp msys-1.0.DLL "phụ" của tôi trong C: \ Users \ đăng nhập của bạn \ AppData \ Local từ một ứng dụng khác. Xóa ứng dụng đó khởi động lại đã khắc phục sự cố cho tôi
Sixto Saez

@SixtoSaez Thú vị. Tôi đã chỉnh sửa câu trả lời để làm cho bước khởi động lại rõ hơn.
VonC

có lẽ những người cũng cần khởi động lại chỉ cần điều đó (một vấn đề khác với việc tải DLL sai)
George Birbilis

7

Nếu khởi động lại không khắc phục được sự cố (như được đề xuất bởi câu trả lời của Greg Hegwill) thì hãy kiểm tra PATH của bạn để biết (các) cài đặt xung đột của msys-1.0.dll (và có thể các DLL liên quan khác).

Trong tình huống cụ thể của tôi, cài đặt msys của MinGW có một bản sao của DLL đó trong binthư mục của nó ( <MinGW_Install_Path>\msys\1.0\bin) và nó được liệt kê trong PATH. Thư mục của Git cmdđã được liệt kê trong PATH, nhưng binkhông phải vậy. (Phiên bản msys-1.0.dll của Git có trong binthư mục. Rõ ràng cài đặt mặc định của MSys-Git không thêm nó binvào PATH.)

Một cách khắc phục tạm thời là thêm binthư mục của Git vào PATH để nó xuất hiện trước các đường dẫn của MinGW. (Một bản sửa lỗi lâu dài hơn có thể sẽ liên quan đến việc phân loại xung đột đường dẫn giữa msys của MinGW và Git và / hoặc xóa cài đặt msys trùng lặp.)


Reboot đã không sửa nó cho tôi! Thực sự có một số mục trùng lặp trong đường dẫn. Tks rất nhiều.
Reginaldo Santos

2

Chỉ muốn chia sẻ kinh nghiệm của tôi ở đây. Tôi đã gặp vấn đề tương tự trong khi biên dịch chéo cho nền tảng MTK trên máy Windows 64 bit. MinGW và MSYS có liên quan đến quá trình xây dựng và vấn đề này xuất hiện. Tôi đã giải quyết nó bằng cách thay đổi msys-1.0.dlltập tin. Cũng khôngrebase.exe phải khởi động lại hệ thống cũng không làm việc cho tôi.

Vì không có rebase.exe được cài đặt trên máy tính của tôi. Tôi đã cài đặt cygwin64 và sử dụng rebase.exebên trong:

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

Mặc dù nổi loạn có vẻ thành công, lỗi vẫn còn. Sau đó, tôi chạy rebaselệnh bên trong thiết bị đầu cuối Cygwin64 và gặp lỗi:

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

Sau đó tôi đã thử một vài địa chỉ nhưng cả hai đều không hoạt động. Vì vậy, tôi đã kết thúc việc thay đổi msys-1.0.dlltập tin và nó đã giải quyết vấn đề.


1

Tôi chạy vào đây ngày hôm nay. Được dẫn dắt bởi câu trả lời của Greg Hewgill, tôi đã xem xét các quy trình đang chạy trên hệ thống của mình để xem liệu có gì bị "kẹt" hay không nếu người dùng khác đã đăng nhập vào máy làm bất cứ điều gì với git. Sau đó tôi đã khởi chạy cygwin (được cài đặt riêng) trên máy cụ thể này. Nó ra mắt ok. Tôi đã đóng nó và sau đó thử lại Tiện ích mở rộng Git (tôi đang thử thao tác kéo) và nó đã hoạt động. Không chắc việc tung ra cygwin có xóa thứ gì đó được chia sẻ hay không nhưng đây là lần đầu tiên tôi gặp phải lỗi này và điều này dường như đã khắc phục nó cho tôi.


1

Tôi gặp vấn đề tương tự, sau một số sự cố và cập nhật Windows 8.0, trên msys git 1.9. Tôi đã không tìm thấy bất kỳ msys / git nào trong đường dẫn của mình, vì vậy tôi chỉ thêm nó trong các cài đặt envinroment của người dùng cục bộ. Nó hoạt động mà không cần khởi động lại.

Về cơ bản, tương tự như RobertB, nhưng tôi không có bất kỳ git / msys nào trong đường dẫn của mình.

Btw:

  1. Tôi đã thử sử dụng rebase -b blablabla msys.dll, nhưng đã gặp lỗi "ReBaseImage (msys-1.0.dll) không thành công với lỗi cuối = 6"

  2. nếu bạn cần điều này một cách nhanh chóng và không có thời gian gỡ lỗi, tôi nhận thấy "Git Bash.vbs" trong thư mục Git thành công bắt đầu bash shell.


Tình hình tương tự đối với tôi. Rebasing as admin thất bại. Đã thêm vào c:\Program Files (x86)\Git\binđường dẫn và bây giờ tôi là vàng.
Jon Crowell

1

Lỗi này rất hiếm khi xảy ra trên máy Windows của tôi. Tôi đã kết thúc việc khởi động lại máy, và lỗi đã biến mất.


0

Tôi đã gặp phải vấn đề này khi anh ta xây dựng LPCEXpresso. Nếu bạn có C: \ MinGW \ bin trong PATH. bằng cách nào đó tôi đã phải gỡ bỏ nó để thoát khỏi vấn đề này vì một số MinGW khác cũng thích


0

Để khắc phục sự cố này, tôi chỉ cần để Rùa Git cài đặt bản cập nhật của nó.



0

Xóa phiên bản cũ của% USERPROFILE% \ AppData \ Local \ SourceTree \ app-xxx làm việc cho tôi. Không chắc cách nó được kết nối với dòng lệnh git ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.