Странная ошибка в консоли CYGWIN "Обнаружено несоответствие базы Cygheap" - PullRequest
0 голосов
/ 17 апреля 2020

Я написал простое приложение в C (для теста) - G CC 9.3.0 на CYGWIN (x86_64-p c -cygwin) на Windows 10. И оно работало нормально. Но через 1-2 дня go Windows 10 был обновлен (Обновление функции 1909 (2)). Я не знаю, является ли обновление причиной следующей ошибки, но теперь приложение иногда может работать, но чаще оно завершается с ошибкой:

$ ./xxx.exe
      0 [main] xxx (7152) D:\prj\xxx\xxx.exe: *** fatal error - cygheap base mismatch detected - 0x180343408/0x1093408.
This problem is probably due to using incompatible versions of the cygwin DLL.
Search for cygwin1.dll using the Windows Start->Find/Search facility
and delete all but the most recent version.  The most recent version *should*
reside in x:\cygwin\bin, where 'x' is the drive on which you have
installed the cygwin distribution.  Rebooting is also suggested if you
are unable to find another cygwin DLL.

Это происходит при запуске в консоли Cygwin (bash) - Cygwin.bat. Я не вижу странных вещей в окружении bash. Но он всегда хорошо работает в PowerShell (cygwin1.dll находится в той же папке, что и приложение). ldd xxx.exe в Cygwin bash показывает:

$ ldd xxx.exe
        ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7fff5e440000)
        KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7fff5da50000)
        KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7fff5b860000)
        cygwin1.dll => /cygdrive/d/prj/xxx/cygwin1.dll (0xcc0000)
        FreeImage.dll => /cygdrive/d/prj/xxx/FreeImage.dll (0x180000000)
        WS2_32.dll => /cygdrive/c/WINDOWS/System32/WS2_32.dll (0x7fff5d870000)
        VCOMP140.DLL => /cygdrive/c/WINDOWS/SYSTEM32/VCOMP140.DLL (0x7fff55550000)
        RPCRT4.dll => /cygdrive/c/WINDOWS/System32/RPCRT4.dll (0x7fff5d750000)
        USER32.dll => /cygdrive/c/WINDOWS/System32/USER32.dll (0x7fff5e0b0000)
        win32u.dll => /cygdrive/c/WINDOWS/System32/win32u.dll (0x7fff5bd40000)
        GDI32.dll => /cygdrive/c/WINDOWS/System32/GDI32.dll (0x7fff5cac0000)
        gdi32full.dll => /cygdrive/c/WINDOWS/System32/gdi32full.dll (0x7fff5b570000)
        msvcp_win.dll => /cygdrive/c/WINDOWS/System32/msvcp_win.dll (0x7fff5b3d0000)
        ucrtbase.dll => /cygdrive/c/WINDOWS/System32/ucrtbase.dll (0x7fff5b470000)
        cygwin1.dll => /cygdrive/d/prj/xxx/cygwin1.dll (0xec0000)

Я создаю приложение с:

...
CC = d:/apps/cygwin/gcc
LIBS := libFreeImage.a
...
$(EXE): $(OBJECTS) $(HEADERS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $(EXE) $(LIBS)

Что здесь не так? Где может быть ошибка?

1 Ответ

1 голос
/ 17 апреля 2020

rm /cygdrive/d/prj/xxx/cyg*.dll и проблема, скорее всего, исчезнет go.

То есть у вас есть мошенническая копия cygwin1.dll (и, возможно, других двоичных файлов cygwin) в каталоге d:\prj\xxx\, которые несовместимы с вашей текущей установкой cygwin. (Или какой-то другой вариант DLL-ада) .

Как правило, когда вы запускаете свой код из оболочки cygwin, вы просто полагаетесь на то, что DLL-библиотеки cygwin загружаются по умолчанию вместо /usr/bin из LDPATH, PATH или локального каталога.

Затем для распространения вашего EXE-файла пользователям, не являющимся cygwin (или просто для запуска вашего EXE-файла вне оболочки Cygwin), вы упаковываете EXE-файл и все зависимые от него файлы. DLL вместе в одну папку. Как у вас это получается, вы, похоже, смешиваете и сопоставляете местоположения DLL в среде Cygwin и пути к исходному коду.

Затем, чтобы вернуться к параметру командной строки Windows, упакуйте свои EXE и cygwin1 .dll обратно в ту же папку.

И чтобы стереть любые другие сомнения, просто пересоберите свой код и обновите Cygwin до последней версии.

...