Błąd krytyczny Cygwina nie może zostać ponownie przypisany. Co to znaczy?

30

Podczas uruchamiania pythonw cygwin pojawia się następujący błąd:

    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

Co to znaczy i co powinienem zrobić, aby to naprawić?

Jon Erickson
źródło

Odpowiedzi:

40

Musisz uruchomić rebaseallpolecenie z rebasepakietu, aby rozwiązać problem.

  1. Zainstaluj rebasepakiet za pomocą setup.exenarzędzia Cygwin
  2. Zamknij wszystko działające przy użyciu cygwin1.dll
  3. Otwórz powłokę Cygwin
  4. Wpisz rebaseallpolecenie

Ponowne uruchomienie jest zwykle wymagane tylko wtedy, gdy instalowane są zainstalowane pakiety, które modyfikują biblioteki ładowane dynamicznie. Przyznam zły nawyk ciągłego działania rebaseallpo zainstalowaniu lub aktualizacji pakietów w instalacji Cygwin, zamiast oczekiwania na błąd, który się pojawi.

Co do tego, dlaczego otrzymałeś ten błąd i jak rebasing rozwiązuje problem, ten post ma o tym do powiedzenia:

Masz to do tyłu. Forking nie przerywa relokacji. Przeniesienie przerywa rozwidlanie. cygwin1.dll musi mieć bardzo specjalny układ pamięci, aby zaimplementować semantykę fork w Win32. Jeśli ten układ pamięci zostanie zakłócony, widelec się zepsuje. Przeniesienie cygwin1.dll zakłóca wymagany układ pamięci. „rebaseall” stara się zlokalizować wszystkie znane biblioteki DLL Cygwin w układzie, który pozwala uniknąć kolizji. Utrzymuje to wymagany układ pamięci, dzięki czemu fork może wykonać swoje zadanie.

Ian C.
źródło
1
próbowałem tego i to nie zadziałało ... to znaczy dopóki nie uruchomiłem ponownie systemu Windows (po rebaseall i peflagsall)
Jon Erickson
Ian C: Jesteś moim bohaterem!
Stefan Rusek
Poza tym wydaje się, że rebaseall potrzebuje uprawnień administratora w systemie Windows 7.
xtofl
Oddzielenie adresu podstawowego może w niektórych przypadkach pomóc, jak sugerowano tutaj: cygwin.com/ml/cygwin/2011-04/msg00306.html
lapo
2
Musisz to zrobić popiołem lub deską rozdzielczą, a nie przez zwykły terminal Cygwin. Uruchom go za pomocą Start -> Uruchom, w cygwin \ usr \ bin \ ash. Po uruchomieniu Ash wpisz / usr / bin / rebaseall i naciśnij klawisz Enter.
Maciej Swic,
10

Oznacza to, że albo program innej firmy, jak skaner antywirusowy lub funkcja losowania adresów DLL, która została wprowadzona w systemie Vista, zakłóciły proces w taki sposób, że nie można go z powodzeniem rozwidlić.

Za pomocą tego rebaseallnarzędzia można zlokalizować biblioteki DLL, aby uniknąć problemu. Jest instalowany domyślnie. Zobacz, rebaseall --helpjak z niego korzystać i /usr/share/doc/Cygwin/rebase-3.0.1.READMEdodatkowe informacje. Jeśli to nie pomoże, peflagsallwarto spróbować jeszcze jednego.

ak2
źródło
dzięki =) obie odpowiedzi pomogły mi ... ale mogę zaakceptować tylko jedną = \
Jon Erickson
5

Miałem ten sam problem po skompilowaniu „numpy”. Dotknięta dll to mtrand.dll. Prosty

$ /bin/rebaseall

nie działał.

Pomogło to: Sprawdź, czy dll, którego dotyczy problem (w tym przypadku time.dll), jest „rebased”:

$ /bin/rebaseall -v

Jeśli nie, utwórz listę zawierającą pełną ścieżkę pliku dll, którego dotyczy problem. Na przykład:

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

Plik może także zawierać więcej bibliotek DLL, po jednym w wierszu. Wtedy zadzwoń

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

bez żadnych innych cygwinów, jak opisano powyżej. Time.dll powinien teraz zostać ponownie bazowany (dodatkowo do „normalnego” zestawu bazowego).

(Dziwne: w ciągu 10 lat używania cygwin z nt, windows2000, xp musiałem „dokonać zmiany bazy” tylko raz. W jeden dzień z (64-bitowym) Window-7 było to już konieczne).

Sebastian Sohr
źródło
2

Istnieje odpowiedź na problem.

Źródło: https://github.com/joyent/node/wiki/Building-node.js-on-Cygwin-(Windows)


Nie można zmienić przypisania do tego samego adresu co rodzic

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

Nie jest to również problem w przypadku node.js. Najpierw zainstaluj bazę → rebase przy użyciu setup.exe, a następnie zamknij wszystkie instancje Cygwin. Uruchom myślnik lub jesion (znajdujący się w katalogu bin w instalacji Cygwin) i uruchom:

$ /bin/rebaseall -v

Powinien zakończyć się bez błędów. Jeśli zamiast tego powyższe powoduje błąd, taki jak:

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

Otwórz powłokę Cygwin i uruchom:

$ chmod 777 ~/AppData/Local/Temp

Zamknij okno powłoki i powtórz powyższe kroki. Po zakończeniu uruchom ponownie komputer. Pamiętaj, aby zamknąć wszystkie otwarte skorupy Cygwin przed użyciem rebaseall.

TunWN
źródło
Dobrą praktyką jest kopiowanie informacji z łącza dla przyszłych użytkowników na wypadek, gdyby łącze kiedykolwiek uległo awarii.
paradd0x