关于出现VirtualAlloc pointer is null导致git崩溃的解决办法

1. 问题描述

今天使用git时,发现Git Bash闪退,而使用Git GUI时提示以下错误:

0 [main] us 0init_cheap: VirtualAlloc pointer is null, Win32 error 487

AllocationBase 0x0, BaseAddress 0x68570000, RegionSize 0x1B0000, State 0x10000

C:\Program Files(x86)\Git\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error0

由于崩溃已经修复,无法重现错误信息,故网上找一张类似图片,错误信息类似下图所示:

 

2. 问题原因

网上查了一下,问题的原因是msys-1.0.dll起始地址冲突。

 

3. 思路分析

使用rebase进行dll基地址重定位。


在ReBase.exe哪里?

a.在以下位置找一下:

C:\Program Files (x86)\MicrosoftSDKs\Windows\v7.1A\Bin

C:\Program Files (x86)\MicrosoftSDKs\Windows\v7.1A\Bin\x64

b.根据您的操作系统类型选择使用。如果没有找到,到网上下载。


4. 解决办法

1. 打开命令提示符

在“开始”——“程序”——“附件”里选择命令提示符,也可使用快捷键“Win + R”打开运行,输入cmd进行打开。


2. 输入以下命令:

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

如果提示:'rebase' 不是内部或外部命令,也不是可运行的程序或批处理文件。

说明系统没有找到ReBase.exe文件,请先添加环境变量。具体请看步骤3:


3. 添加环境变量

在“我的电脑”、“计算机”或“此电脑”上右击,选择“属性(R)”——“高级系统设置”——“高级”选项卡——“环境变量(N)...”,在用户变量或系统变量里双击“PATH”变量,将“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\x64;”添加到变量值中,然后一路确定即可。


4. 重新打开命令提示符。

这里需要重新打开集命令提示符,不然环境变量配置在当前命令提示符窗口中不会生效。


5. 执行第2步的操作

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

 

您可能会看到如下失败信息:

REBASE: *** RelocateImage failed(program).  Image may be corrupted

REBASE: *** RelocateImage failed(files).  Image may be corrupted

REBASE: *** RelocateImage failed(msys-1.0.dll).  Image may be corrupted

 

REBASE: Total Size of mapping0x0000000000000000

REBASE: Range 0x0000000068570000-0x0000000068570000

不要着急,只是说“可能被损坏”而已。

 

6. 重启您的电脑

重启之后Git Bash和GitGUI都可以正常使用了。

如果还是有问题(当然我只是猜测),您可以换一个别的地址执行试一下。由于直接操作内存中的地址应该是比较危险的事情,所以尽量使用一个在“0x68570000”附近的地址,比如“0x69000000”。(对于直接操作内存地址会不会有别的问题,计算机操作系统方面的东西不是太懂,望各位指正)。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ 中,可以使用 `VirtualAlloc` 函数来分配内存,并将其用作 Thunk 函数的代码。下面是一个示例代码,展示了如何使用 `VirtualAlloc` 来创建一个简单的 Thunk 函数: ```cpp #include <iostream> #include <windows.h> // 定义一个函数指针类型 typedef int (*FuncPtr)(int); // Thunk 函数 int __stdcall ThunkFunction(int num) { std::cout << "Thunk function called with parameter: " << num << std::endl; // 调用原始函数 return num * 2; } int main() { // 分配内存空间 DWORD dwSize = 4096; // 分配的内存大小,这里假设为 4KB LPVOID lpAddress = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 将 Thunk 函数的代码复制到分配的内存中 memcpy(lpAddress, ThunkFunction, dwSize); // 创建函数指针并将其设置为分配的内存地址 FuncPtr thunk = (FuncPtr)lpAddress; // 使用函数指针调用 Thunk 函数 int result = thunk(5); std::cout << "Result: " << result << std::endl; // 释放分配的内存 VirtualFree(lpAddress, 0, MEM_RELEASE); return 0; } ``` 在这个示例中,我们使用 `VirtualAlloc` 函数分配了一块内存空间,大小为 4KB。然后,使用 `memcpy` 函数将 Thunk 函数的代码复制到这块内存中。 接下来,我们创建了一个函数指针 `thunk`,并将其设置为分配的内存地址。通过这个函数指针,我们可以调用 Thunk 函数。 最后,我们使用函数指针调用 Thunk 函数,并打印出结果。完成后,使用 `VirtualFree` 函数释放分配的内存。 需要注意的是,使用 `VirtualAlloc` 分配的内存需要适当地设置内存保护属性,以确保其可执行和可读写。在本示例中,使用了 `PAGE_EXECUTE_READWRITE` 属性,表示内存既可执行又可读写。具体的内存保护属性需要根据实际需求进行选择。 此外,需要注意 Thunk 函数的参数传递和调用约定,以及在不同平台和编译器下可能存在的差异。这些细节需要根据具体情况进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值