У меня есть базовый код, который выдает 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
SDL_DestroyWindow(screen);
передSDL_Quit();
- person Jean Pierre Dudey   schedule 17.08.2015SDL_DestroyWindow(screen);
, но это не помогает segfault вSDL_Quit();
- person brneuro   schedule 17.08.2015apt-get install libsdl2-*
и даже пробовал на своем ПК создавать собственные библиотеки из исходников. - person brneuro   schedule 18.08.2015-Bstatic
к командам компиляции и компоновки позволяет завершить работу без ошибки сегментации... не знаю, почему динамическая компоновка является проблемой, может быть, это подсказка? Я не думаю, что меня волнует, как я на самом деле связываюсь, но я хотел бы выяснить, что происходит не так. - person brneuro   schedule 18.08.2015-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.2015bt
, так как обратная трассировка может дать вам этот стек вызовов. Я спросил о связывании только потому, что думал, что у вас могут быть несовместимые версии, и не ожидал, что изменение решит сбой. Поскольку вы хотите провести расследование, взгляните наhttps://www.libsdl.org/release/SDL-1.2.15/src/SDL.c
, если у вас еще нет источника. Это показывает, что ваш вызов для выхода просто разбивается на отдельные вызовы подсистемы, которые вы могли бы сделать. Возможно, вы захотите попробовать их по отдельности, чтобы посмотреть, что вызывает сбой. - person donjuedo   schedule 18.08.2015SDL_VideoQuit()
кажется виновником, но я не уверен, как интерпретировать № 4in ??
- person brneuro   schedule 18.08.2015*.a
, тогда как динамическая компоновка ссылается на общие объекты*.so
. В вашей системе может быть несколько версий одной и той же библиотеки. Попробуйте вывести список зависимостей динамически подключаемой программы, запустивld -r program
. Бьюсь об заклад, скомпилированная версия на ПК или ноутбуке будет иметь разные зависимости. Отправьте результат как РЕДАКТИРОВАТЬ. - person alvits   schedule 18.08.2015