Git SVN - 在Cygwin下出现错误

19
我使用Cygwin和Git。我想用Git提交到SVN:git svn dcommit。但是会出现奇怪的错误:

$ git svn dcommit
      4 [main] perl 5536 C:\cygwin\bin\perl.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\perl5\5.10\i686-cygwin\auto\List\Util\Util.dll to same address as parent: 0xA20000 != 0xB40000
Stack trace:
Frame     Function  Args
0088B508  6102749B  (0088B508, 00000000, 00000000, 00000000)
0088B7F8  6102749B  (61177B80, 00008000, 00000000, 61179977)
0088C828  61004AFB  (611A136C, 6125AB3C, 00A20000, 00B40000)
End of stack trace

我该如何解决它?谢谢。

P.S. 我的操作系统是Windows 7 64位。

更新

rebase命令可以帮助解决问题,但执行完rebase后需要重新启动计算机。


我来到这里是因为原始问题,但是我在ash内运行的任何命令也会导致错误:[main] ash 7152 fork: child 1920 - died waiting for dll loading, errno 11 - fastmultiplication
4个回答

20

你尝试过像这里描述的那样执行rebaseall吗?

当你使用Cygwin时,有时会出现类似这样的错误

unable to remap some.dll to same address as parent someapp 4292 fork:
child 3964 - died waiting for dll loading, errno 11"

您需要运行rebaseall命令。为了运行它,请关闭所有的Cygwin窗口,执行<cygwin_home>\bin\ash.exe。这将会打开一个新的控制台窗口。在那里执行rebaseall命令。一旦完成,您就可以重新运行Cygwin而不会出现任何问题 :-)

gor报告,他不得不重启计算机才能使rebaseall正常工作。
Dan Moulding在评论中提到:

我只想补充一点,关闭所有Cygwin窗口可能是不够的。
在重新定位之前,您应确保终止和/或停止所有Cygwin进程和服务(从ash运行ps -a应该什么都没有显示,除了ashps)。


rsenna reports in the comments:

为了解释为什么需要这样做,请参见fatal error - unable to remap to same address as parent: Cygwin, Ruby on Rails, System calls
那么实际上发生了什么? 嗯,在这种情况下,问题是由于Windows管理其.dll's的方式导致的。
Windows使用ASLR(地址空间布局随机化)来管理其.dll's。每次启动计算机时,它会将您的dll加载到不同的内存区域中。 如果这个过程出了问题,那么下一次查找该.dll时,你可能会使系统崩溃。或者如果你在错误的位置查找,你也可能会使系统崩溃。 那么这个系统怎么会出问题呢?好吧,运行cygwin设置程序可能会影响记录保持,特别是如果ASLR已更改但Cygwin仍然保留旧副本时(当安装未完成时可能会发生这种情况)。
ASLR是对抗恶意软件或黑客的很好的防御措施。黑客无法不断尝试新的地址来查找你的.dll,以免使你的系统崩溃。

1
没有效果。我关闭了所有的Cygwin窗口,运行了c:\cygwin\bin\ash\bin\rabaseallexit。然后启动Cygwin,但仍然出现相同的错误。 - gor
1
@gor:它不应该停止工作,除非(也许)您在Cygwin配置中进行了大量更改,例如安装了许多新组件或部分更新了现有配置。 - VonC
1
我想补充一点,仅关闭所有Cygwin窗口可能是不够的。在重新定位之前,您应该确保终止和/或停止所有Cygwin进程和服务(从ash运行ps -a应该除了ashps外什么都不显示)。 - Dan Moulding
1
@rsenna 很有趣。我在答案中添加了相关的博客文章摘录。 - VonC
1
在 git 控制台(win 8)中我也遇到了同样的问题。但是,这不是完整的 cygwin 设置。我找不到任何 ash.exe。有没有什么想法来处理这种情况? - Meglio
显示剩余5条评论

13
我遇到了这个问题,但运行rebaseall无法解决问题。我一直在尝试运行git svn dcommit,但无论我运行多少次rebaseall和/或重启都会出现提到的remap错误。

以下是我看到的示例。请注意对地址0x6FA00000的引用。

$ git svn dcommit Committing to 844 [main] perl 1136 C:\cygwin\bin\perl.exe: * 致命错误 - 无法将C:\cygwin\bin\cygdb-4.5.dll重新映射到与父级相同的地址:0x58B40000!= **0x6FA00000 堆栈跟踪:Frame
Function Args 0082B458 6102792B (0082B458, 00000000, 00000000, 00000000) 0082B748 6102792B (6117DC60, 00008000, 00000000, 6117F977) 0082C778 61004F3B (611A6FAC, 61247BCC, 58B40000, 6FA00000) End of stack trace 3 [main] perl 4680 fork: child 1136 - died waiting for dll loading, errno 11

我认为这并不重要,但我正在使用公司的企业镜像,在Windows7 Enterprise 32位上运行。

我找到了解决此问题的建议,具体步骤在Chromium wiki中:

http://code.google.com/p/chromium/wiki/CygwinDllRemappingFailure

我使用cygwin中的ListDlls.exe(http://technet.microsoft.com/en-us/sysinternals/bb896656.aspx)来捕获正在运行的进程中加载的DLL的输出,并针对引起问题的地址进行了grep:

$ ./ListDlls.exe | tee foo
$ cat foo | grep 6fa000

...

0x6fa00000 0x3c000 9.05.0005.9574 C:\PROGRA~1\Sophos\SOPHOS~1\SOPHOS~1.DLL

这个匹配的是Sophos Security提供的一个DLL的加载地址,我们的IT组默认在我们的机器上运行它,并且这是故障的原因。rebaseall无法解决问题,因为Sophos提供的DLL不是cygwin的一部分。
Chromium Wiki建议选择比引起问题的DLL小的基地址,所以我选择了0x60000000。根据你可能看到的有害DLL,您可能需要选择不同的基地址。
我从cmd.exe提示符下重新运行了rebaseall,并且没有运行任何其他cygwin进程。

c:\cygwin\bin>ash /usr/bin/rebaseall -b 0x60000000

重启我的cygwin shell后,git svn dcommit正常工作了。

谢谢!这些错误之前时有发生,但今天开始咬我了,无论怎么变基都无法解决。 - Alan Krueger

4

我遇到了类似的问题,直到我运行了以下三个命令才解决了问题:

  1. rebaseall
  2. perlrebase
  3. peflagsall

请尝试运行这三个命令来解决问题。


我希望这个答案能够更靠前,因为perlrebase对我非常关键。我相信git仍然有许多perl脚本。 - e40
Joel的回答让我意识到问题出在Perl上。而perlrebase为我解决了这个问题。 - chuckf

1
以上的答案并没有为我们团队在64位Windows(Windows 7)上运行cygwin git的问题提供可靠的解决方法。我在git邮件列表上发布了一个问题,并从Pascal Obry那里得到了以下回复:
Jon,
这是一个已知的问题。我已经离开Windows世界很长时间了,但我仍然有一些笔记可以“修复”它:
从ash shell中(确保没有Cygwin进程仍在运行): $ rebaseall $ peflagsall
再次尝试您的命令。如果仍然无法正常工作,请尝试使用以下命令:$ rebaseall -b 0x50000000 -o 0x80000或-b 0xNNNN0000,其中NNNN是2000和7000之间的任何十六进制数字。-o选项告诉dlls之间留更多空间,这也可能有所帮助。在我的情况下确实如此。
如果您感到好奇,请查看/usr/share/doc/Cygwin/rebase-3.0.README以获取更多说明。

另请参阅:http://www.spinics.net/lists/git/msg183753.html

Pascal在后续中还指出:

...最重要的部分是运行peflagsall,这是修复Win7的正确方法。

初步结果表明,此解决方案比此处记录的其他建议更有效。我将在一周左右更新此帖子,以指示此配方是否足以获得永久可靠的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接