Cygwin schwerwiegender Fehler kann nicht neu zugeordnet werden. Was bedeutet das?

30

Bei der Ausführung pythonin Cygwin wird folgende Fehlermeldung angezeigt:

    0 [main] python 6140 C:\cygwin\bin\python.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\python2.6\lib-dynload\time.dll to same address as parent: 0x2B0000 != 0x360000
Stack trace:
Frame     Function  Args
00288E68  6102749B  (00288E68, 00000000, 00000000, 00000000)
00289158  6102749B  (61177B80, 00008000, 00000000, 61179977)
0028A188  61004AFB  (611A136C, 6124112C, 002B0000, 00360000)
End of stack trace
    0 [main] python 9048 fork: child 6140 - died waiting for dll loading, errno 11
abort: Resource temporarily unavailable

Was bedeutet es und was soll ich tun, um es zu beheben?

Jon Erickson
quelle

Antworten:

40

Sie müssen den rebaseallBefehl aus dem rebasePaket ausführen , um das Problem zu beheben.

  1. Installieren Sie das rebasePaket mit dem Cygwin- setup.exeDienstprogramm
  2. Schließe alles, was läuft cygwin1.dll
  3. Öffnen Sie eine Cygwin-Shell
  4. Geben Sie rebaseallan der Eingabeaufforderung

Ein Neustart ist normalerweise nur erforderlich, wenn installierte Pakete installiert sind, mit denen dynamisch geladene Bibliotheken geändert werden. Ich gebe zu, dass es eine schlechte Angewohnheit ist, rebaseallnach der Installation oder Aktualisierung von Paketen in einer Cygwin-Installation immer zu laufen , anstatt auf den Fehler zu warten, den Sie gemeldet haben.

In diesem Beitrag erfahren Sie, warum dieser Fehler aufgetreten ist und wie das Problem durch erneutes Basieren behoben wird :

Du hast es rückwärts. Das Gabeln unterbricht den Umzug nicht. Umzug bricht Gabelung. cygwin1.dll benötigt ein ganz besonderes Speicherlayout, um die Fork-Semantik in Win32 zu implementieren. Wenn dieses Speicherlayout gestört ist, bricht die Gabel. Durch das Verschieben von cygwin1.dll wird das erforderliche Speicherlayout gestört. 'rebaseall' versucht, alle bekannten Cygwin-DLLs in einem Layout zu lokalisieren, das Kollisionen vermeidet. Auf diese Weise bleibt das erforderliche Speicherlayout erhalten, damit fork seine Aufgabe erfüllen kann.

Ian C.
quelle
1
Ich habe das ausprobiert und es hat nicht funktioniert ... bis ich Windows neu gestartet habe (nach einem Rebaseall und Peflagsall)
Jon Erickson
Ian C: Du bist mein Held!
Stefan Rusek
Außerdem scheint rebaseall Administratorrechte für Windows 7 zu benötigen.
xtofl
Die Eingabe einer Basisadresse kann in einigen Fällen hilfreich sein, wie hier vorgeschlagen: cygwin.com/ml/cygwin/2011-04/msg00306.html
lapo
2
Sie müssen dies in Asche oder Strich tun, nicht über das normale Cygwin-Terminal. Starten Sie es mit Start -> Ausführen in cygwin \ usr \ bin \ ash. Sobald ash ausgeführt wird, geben Sie / usr / bin / rebaseall ein und drücken Sie die Eingabetaste.
Maciej Swic
10

Dies bedeutet, dass entweder ein Programm eines Drittanbieters wie ein Virenscanner oder die in Vista eingeführte Funktion zur Zufallsgenerierung von DLL-Adressen Ihren Prozess derart gestört haben, dass er nicht erfolgreich gegabelt werden konnte.

Mit dem rebaseallDienstprogramm können DLLs so festgelegt werden, dass das Problem vermieden wird. Es ist standardmäßig installiert. Sehen Sie rebaseall --help, wie es zu benutzen, und /usr/share/doc/Cygwin/rebase-3.0.1.READMEfür weitere Details. Wenn es nicht hilft, peflagsalllohnt sich ein weiterer Versuch.

ak2
quelle
danke =) beide antworten haben mir geholfen ... aber ich kann nur einen akzeptieren = \
Jon Erickson
5

Ich hatte das gleiche Problem, nachdem ich "numpy" kompiliert hatte. Die betroffene DLL war mtrand.dll. Einfach

$ /bin/rebaseall

funktioniert nicht.

Folgendes hat geholfen: Überprüfen Sie, ob die betroffene DLL (in diesem Fall time.dll) tatsächlich "rebasiert" ist:

$ /bin/rebaseall -v

Wenn nicht, erstellen Sie eine Liste, die den vollständigen Pfad der betroffenen DLL enthält. Z.B:

$ find /lib -name 'time.dll' > /tmp/mydll.txt

Die Datei kann auch mehrere DLLs enthalten, eine pro Zeile. Dann ruf an

$ /bin/rebaseall -v -T /tmp/mydll.txt

Wie oben beschrieben, wird kein anderes Cygwin-Zeug ausgeführt. Die time.dll sollte nun umbasiert werden (zusätzlich zum "normalen" rebaseall).

(Seltsam: In 10 Jahren mit cygwin unter nt, windows2000, xp musste ich nur einmal "rebase". In einem Tag mit (64-Bit) window-7 war dies bereits notwendig.)

Sebastian Sohr
quelle
2

Es gibt eine Antwort auf das Problem.

Quelle: https://github.com/joyent/node/wiki/Building-node.js-on-Cygwin-(Windows)


Es ist nicht möglich, dieselbe Adresse wie die übergeordnete Adresse erneut zuzuordnen

fatal error – unable to remap \?\C:\cygwin\lib\python2.6\lib-dynload\time.dll to same address as parent: 0×360000 != 0×3E0000

Dies ist auch bei node.js kein Problem. Installieren Sie base → rebase zuerst mit setup.exe und schließen Sie dann alle Cygwin-Instanzen. Starten Sie dash oder ash (im bin-Verzeichnis unter Cygwins Installation) und führen Sie Folgendes aus:

$ /bin/rebaseall -v

Es sollte ohne Fehler enden. Wenn stattdessen der obige Fehler wie folgt auftritt:

rebaseall:'/cygdrive/c/Users/ADMINI~1/AppData/Local/Temp' is not writable

Öffnen Sie eine Cygwin-Shell und führen Sie Folgendes aus:

$ chmod 777 ~/AppData/Local/Temp

Schließen Sie Ihr Shell-Fenster und wiederholen Sie die obigen Schritte. Sobald Sie fertig sind, starten Sie Ihren PC neu. Denken Sie daran, alle offenen Cygwin-Shells zu schließen, bevor Sie rebaseall verwenden.

TunWN
quelle
Es wird empfohlen, die Informationen aus dem Link für zukünftige Benutzer zu kopieren, falls der Link jemals fehlschlägt.
paradd0x