segfault 0x8B в SDL_quit() только после создания окна отображения

У меня есть базовый код, который выдает segfault (0x8B) на одном из моих компьютеров, но не на другом. Запуск Ubuntu на обоих (14.04.3 на проблемном ПК и 14.04.2 на моем не проблемном ноутбуке), разработка кодовых блоков на обоих.

#ifdef __cplusplus
#include    <cstdlib>
#else
#include    <stdlib.h>
#endif


#include    <SDL2/SDL.h>
#include    <SDL2/SDL2_gfxPrimitives.h>

int main ( int argc, char** argv )
    {
    // initialize SDL video
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        return 1;
    }

    SDL_Window *screen = SDL_CreateWindow("My Game Window",
        0,
        0,
        640, 480,
        SDL_WINDOW_OPENGL | SDL_WINDOW_INPUT_GRABBED);

SDL_Quit();
return 0;
}

Код выдает ошибку сегментации в SDL_Quit(); на моем ПК, но не на моем ноутбуке. Я считаю, что это что-то с процессом компиляции, потому что, если я компилирую на своем ноутбуке и запускаю на своем ПК, ПК не выдает никаких ошибок. Если я компилирую на своем ПК, я получаю segfault как на своем ПК, так и на ноутбуке. Я проверил, что я действительно компилирую с одинаковыми параметрами на обеих машинах, и проблема не устранена.

Не знаете, куда идти отсюда? Мысли?

РЕДАКТИРОВАТЬ: Несмотря на предложение JPD в комментариях, проблема остается. Однако проблема наверняка связана с экраном, потому что удаление вызова SDL_CreateWindow() предотвращает segfault на SDL_Quit()

EDIT2: все еще изучаю отладку, segfaults для меня новы, и только что запустил программу через gdb из командной строки и получил новую информацию, но все еще не уверен, что с ней делать

Program received signal SIGSEGV, Segmentation fault.
__GI___pthread_mutex_lock (mutex=0x606b00) at ../nptl/pthread_mutex_lock.c:66
66  ../nptl/pthread_mutex_lock.c: No such file or directory.

Я не могу найти этот файл в настройках своего ПК, но у меня его нет и на моем ноутбуке. Так что не уверен, почему один компьютер жалуется, а другой нет. идеи?

EDIT3: нашел это https://forums.libsdl.org/viewtopic.php?t=8735&sid=fd6401057fbfe9cfdd04a5445a3dbbab, но пока не понимаю реализации обходного пути, если это относится и к моей проблеме.

EDIT4: согласно ссылке в EDIT3, я попытался добавить -pthread как в команды компиляции, так и в команды связывания, но до сих пор не нашел решения. Я пробовал использовать эти флаги как до, так и после ссылок на библиотеки SDL2.

EDIT5: статическая привязка к библиотекам SDL2 и SDL2_gfx исправлена, но не уверен, почему динамическая привязка не работает. обратная связь следует:

#0  __GI___pthread_mutex_lock (mutex=0x606b00) at ../nptl/pthread_mutex_lock.c:66
#1  0x00007ffff600c2c7 in XrmDestroyDatabase () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#2  0x00007ffff5ff47b3 in _XFreeDisplayStructure () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#3  0x00007ffff5fe24ef in XCloseDisplay () from /usr/lib/x86_64-linux-gnu/libX11.so.6
#4  0x00007ffff7b81360 in ?? () from /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0
#5  0x00007ffff7b7395e in SDL_VideoQuit () from /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0
#6  0x00007ffff7b4df75 in SDL_QuitSubSystem () from /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0
#7  0x00007ffff7b4e01e in SDL_Quit () from /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0
#8  0x00000000004019f3 in main (argc=1, argv=0x7fffffffdee8) at main.cpp:371

person brneuro    schedule 17.08.2015    source источник
comment
Попробуйте использовать SDL_DestroyWindow(screen); перед SDL_Quit();   -  person Jean Pierre Dudey    schedule 17.08.2015
comment
Спасибо за предложение, JPD. К сожалению, я получаю тот же результат. Нет проблем с запуском SDL_DestroyWindow(screen);, но это не помогает segfault в SDL_Quit();   -  person brneuro    schedule 17.08.2015
comment
На ваших двух компьютерах установлены две разные версии библиотеки, на которую вы ссылаетесь? И вы связываете его статически или динамически (вероятно)?   -  person donjuedo    schedule 18.08.2015
comment
связывание динамически. Я установил оба с помощью apt-get install libsdl2-* и даже пробовал на своем ПК создавать собственные библиотеки из исходников.   -  person brneuro    schedule 18.08.2015
comment
Я уверен, что проблема не в pthread_mutex_lock.c, так что просмотр исходников вряд ли поможет. Но если бы вы могли распечатать стек вызовов, который достиг этой строки, это могло бы многое сказать.   -  person donjuedo    schedule 18.08.2015
comment
как получить стек вызовов для публикации? Извините, новичок еще немного. В то же время, добавление -Bstatic к командам компиляции и компоновки позволяет завершить работу без ошибки сегментации... не знаю, почему динамическая компоновка является проблемой, может быть, это подсказка? Я не думаю, что меня волнует, как я на самом деле связываюсь, но я хотел бы выяснить, что происходит не так.   -  person brneuro    schedule 18.08.2015
comment
добавление -Bstatic -lSDL2 -lSDL2_gfx -Bdynamic работает. В динамической компоновке я также добавил sdl-config --libs к своим параметрам, и прочитал, что было предложено изменить это на sdl-config --static-libs. Однако это было интерпретировано как добавление -lpthread, что, по-видимому, все еще было проблемой, как указано в сообщении, на которое я ссылался в EDIT3. Похоже, мне вообще не нужно связывать это или -pthread, и полное удаление sdl-config --static-libs или sdl-config --libs было единственным способом заставить это работать с помощью компиляции кодовых блоков. Добрался до этого, протестировав свои собственные команды сборки в CLI.   -  person brneuro    schedule 18.08.2015
comment
Мои навыки gdb немного заржавели. bt, так как обратная трассировка может дать вам этот стек вызовов. Я спросил о связывании только потому, что думал, что у вас могут быть несовместимые версии, и не ожидал, что изменение решит сбой. Поскольку вы хотите провести расследование, взгляните на https://www.libsdl.org/release/SDL-1.2.15/src/SDL.c, если у вас еще нет источника. Это показывает, что ваш вызов для выхода просто разбивается на отдельные вызовы подсистемы, которые вы могли бы сделать. Возможно, вы захотите попробовать их по отдельности, чтобы посмотреть, что вызывает сбой.   -  person donjuedo    schedule 18.08.2015
comment
см. мой EDIT5, № 5 SDL_VideoQuit() кажется виновником, но я не уверен, как интерпретировать № 4 in ??   -  person brneuro    schedule 18.08.2015
comment
Давайте продолжим обсуждение в чате.   -  person brneuro    schedule 18.08.2015
comment
Статическая компоновка использует архивные библиотеки *.a, тогда как динамическая компоновка ссылается на общие объекты *.so. В вашей системе может быть несколько версий одной и той же библиотеки. Попробуйте вывести список зависимостей динамически подключаемой программы, запустив ld -r program. Бьюсь об заклад, скомпилированная версия на ПК или ноутбуке будет иметь разные зависимости. Отправьте результат как РЕДАКТИРОВАТЬ.   -  person alvits    schedule 18.08.2015


Ответы (1)


Проблема решилась после обновления видеодрайверов.

person brneuro    schedule 20.08.2015