기술적 세부 사항
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에서 힙에 ~ 5MB 큰 메모리 청크를 할당하지 못하는 반면 ~ 2.5MB 큰 구멍 만 분명히 사용 가능했습니다. 관련 코드는 msysgit source 에서 볼 수 있습니다 .
주소 공간의 해당 부분이 비어 있지 않은 이유는 무엇입니까?
여러 가지 이유가있을 수 있습니다. 필자의 경우 충돌하는 주소에로드 된 다른 모듈이었습니다.
마지막 주소는 약 0x68570000 + 5MB = 0x68C50000이지만 0x68810000 이상에서로드되는 이러한 WOW64 관련 DLL이있어 할당을 차단합니다.
공유 DLL이있을 때마다 Windows는 일반적으로 재배치 처리를 줄이기 위해 모든 프로세스에서 동일한 가상 주소로 DLL을로드하려고합니다. 이 시스템 구성 요소가 이번에 충돌하는 주소로로드 된 것은 불행한 일입니다 .
왜 Git에 Cygwin이 있습니까?
Git은 일부 저수준 명령과 많은 유용한 유틸리티로 구성되어 있으며 대부분 유닉스 계열 시스템에서 개발 된 풍부한 제품군이기 때문입니다. 대규모 재 작성없이 빌드하고 실행할 수 있으려면 최소한 부분적인 유닉스 계열 환경이 필요합니다.
이를 위해 사람들은 Windows에서 Unix와 같은 방식으로 프로그램을 개발할 수있는 최소한의 빌드 도구 인 MinGW와 MSYS를 발명했습니다. MSYS에는 공유 라이브러리 인 this가 포함되어있어 msys-1.0.dll
런타임 동안 두 플랫폼 간의 호환성 문제를 해결하는 데 도움 이 됩니다. 누군가가 이미 동일한 문제를 해결해야했기 때문에 Cygwin에서 가져온 부분이 많습니다.
Cygwin이 아니며 MinGW의 런타임 DLL이며 여기서 이상하게 작동합니다.
Cygwin에서이 코드는 실제로 MSYS 1.0에 포함 된 이후 많은 부분이 변경되었습니다. 해당 파일 의 마지막 커밋 메시지 는 "Import Cygwin 1.3.4"(2001 년부터)입니다.
모두 현재 Cygwin에서 와 MSYS의 새 버전 - MSYS2는 - 이미 잘하면 더 강력 장소에서 다른 로직을 가지고있다. 구식 MSYS 시스템을 사용하여 빌드 된 Windows 용 Git의 구 버전입니다.
깨끗한 솔루션 :
- Windows 2 용 Git 설치 - 제대로 유지 관리 되는 새로운 MSYS2로 빌드 되었으며 많은 새로운 기능, 많은 버그 수정, 보안 개선 등이 있습니다. 가능하다면 64 비트 버전 을 사용하는 것이 좋습니다 . 그러나 rebase 해결 방법 은 32 비트 시스템에서 자동으로 수행되므로 문제가 발생할 가능성도 낮아야합니다.
- 주소 공간을 정리하기 위해 컴퓨터를 다시 시작하면 (이 모듈을 다른 임의의 주소로로드) 작동 할 수 있지만 실제로 Windows 2 용 Git으로 업그레이드하면 보안 수정 사항이 적용됩니다.
해키 솔루션 :
- 다른 버전의 Git 또는 다른 MSYS 기반 응용 프로그램에는 다른 주소,이 힙의 크기 등을 사용하는
PATH
다른 버전이있을 수 있으므로 변경 이 때때로 작동 할 수 있습니다 msys-1.0.dll
.
- Rebasing
msys-1.0.dll
은 1) DLL이기 때문에 이미 재배치 정보를 가지고 있고 2) "모든 버전의 Windows OS에서 (...) DLL이 항상 동일한 주소 공간에서로드된다는 보장이 없기 때문에 시간 낭비가 될 수 있습니다." 어쨌든 ( 소스 ). 이것이 도움이 될 수있는 유일한 방법 msys-1.0.dll
은 충돌하는 주소에 자체로드 되면 사용하려고하는 것입니다. 이것은 때때로 Git for Windows 사용자가 32 비트 시스템 에서 자동으로 수행하는 일이므로 때때로 그런 경우 입니다.
- 위의 결과를 고려할 때 원래 이진
msys-1.0.dll
파일에 다른 값을 사용 하도록 이진 파일을 패치 _cygheap_start
하여 문제를 즉시 해결했습니다.