Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 0
Регистрация: 13.07.2021
Сообщений: 45

Gdb виснет при отладке SDL

04.12.2025, 22:13. Показов 583. Ответов 6

Студворк — интернет-сервис помощи студентам
Всем здаравствуйте. Нашёл я тут интересный курс по созданию 3D графики from scratch: только компилятор, SDL и чистый C. На одном из заданий свалилась у меня программа в segmentation fault. Ошибку я нашёл, благо несложная программа, в самом начале курса, кода не много. Но меня очень заинтересовал случай, произошедший при отладке, хочу с ним разобраться.

Сперва всё идёт хорошо, мы заходим в функцию main, инициализируем SDL, а вот как только вызывается функция SDL_CreateWindow, у меня виснет нафиг всё, причём так, что я секунд 30 не могу даже 2-й терминал вызвать, чтобы посмотреть PID процесса и пристрелить его к такой-то матери.

В чём может быть проблема? У меня на машине стоит Linux Slackware, оконный менеджер icewm, при компиляции выставлены флаги -g и -Wall, в начале отладки ставлю брейкпоинт на main и степами аккуратно двигаюсь.

В гугле ничего не накопал, возможно надо что-то сделать, с какими-то флагами запустить отладчик, чтобы посмотреть, что творится в коде библиотечной функции? Исходный код библиотеки я глянул, нашёл функцию, где заголовки, где дефайнятся нужные структуры, но всё равно не понял, почему я не могу проследовать по коду в отладчике, и почему он виснет на простенькой программе в 100 с небольшим строк включая переносы.

Заранее спасибо.

P.S. работаю с библиотекой SDL2.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2025, 22:13
Ответы с готовыми решениями:

CodeLite ошибка failed to locate gdb! at 'gdb'
Установил на двух компьютерах CodeLite. На десятке и на семерке. Выдает окошко failed to locate...

Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2?
В официальной доке как-то скомкано написано. При инициализации SDL TTF и при загрузке шрифта...

Компилятор требует SDL/SDL.h
Доброго времени суток! Мне нужно скомпилировать простую графическую программу из учебника. ...

6
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
05.12.2025, 07:05
Я тут просто мимо ппроходил

Скинь плз ссылку на курс

И попробуй breakpoint поставить после SDL_CreateWindow
0
4 / 4 / 0
Регистрация: 13.07.2021
Сообщений: 45
05.12.2025, 13:49  [ТС]
По-моему он на Шервуде есть, надо для этого аккаунт там иметь. Сам курс 80 гигов весит. Посмотрю, может смогу раздать как-то.
Цитата Сообщение от asdzxc Посмотреть сообщение
И попробуй breakpoint поставить после SDL_CreateWindow
Не понимаю, как мне это поможет. Прога у меня запускается нормально сейчас, окно создаётся, фон меняется, по нажатию на ESC завершается. Мне хотелось бы именно по шагам посмотреть, что где происходит. А я не могу. При вызове библиотечной функции SDL у меня виснет всё на на несколько десятков секунд.

Хотя, попробую, может что покажет интересного.
0
Модератор
Эксперт Java
 Аватар для alecss131
2835 / 1344 / 403
Регистрация: 11.08.2017
Сообщений: 4,297
Записей в блоге: 2
05.12.2025, 13:55
Для отладки графики, а точнее того что происходит на видеокарте надо использовать RenderDoc, но он не работает с фиксированным конвейером (glBegin/glEnd).
И по сути для 3д SDL не нужен, его можно заменить на GLFW, чтобы окно кроссплатформенно создавать.
0
4 / 4 / 0
Регистрация: 13.07.2021
Сообщений: 45
05.12.2025, 18:44  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
И по сути для 3д SDL не нужен, его можно заменить на GLFW, чтобы окно кроссплатформенно создавать.
Цель не в том, что мне здесь и сейчас надо получить результат. Я хочу понять: как выводятся пиксели, как рисуются примитивы, как буферизуется всё, что надо, как происходит рендеринг, как всё устроено на низком уровне и т.д.

Курс не для запуска на видюхе (у него где-то есть другой курс по графике не железе), тут олдскульный запуск на проце. Это позволяет не вдаваться уж слишком в нюансы и сформировать мощный фундамент, на который потом легко лягут какой-нибдуь DirectX3D, вулкан или программирование для запуска на GPU.

Цель - научиться, выстроить фундамент и понимание. Не люблю чёрные ящики, в которые что-то заходит, как-то там преобразуется и потом что-то выходит. Хочу понимать, что я делаю. Мне эта ситуация нисколько не мешает проходить дальше курс, тут вопрос именно в понимании: а) какого вообще происходит; б) как это пофиксить или избежать.

Надеюсь что понятно объяснил, зачем мне это).

Добавлено через 4 часа 40 минут
Курс можно посмотреть по ссылке вот здесь: программирование трёхмерной компьютерной графики.
0
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
07.12.2025, 14:22
Цитата Сообщение от Uko1ove Посмотреть сообщение
На одном из заданий свалилась у меня программа в segmentation fault. Ошибку я нашёл, благо несложная программа, в самом начале курса, кода не много. Но меня очень заинтересовал случай, произошедший при отладке, хочу с ним разобраться.
Цитата Сообщение от Uko1ove Посмотреть сообщение
почему он виснет на простенькой программе в 100 с небольшим строк включая переносы.
Надо скопировать эту программу на форум, а перед этим удалить все лишние строки, которые не влияют на воспроизведение проблемы. Вы пишите, что была ошибка в программе и вы что-то сделали, но не написали что именно, и проблема исчезла. Надо показать целиком минимальную программу и написать, что нужно сделать, чтобы проблема исчезла или опубликовать исправленный пример и написать, что нужно сделать, чтобы воспроизвести проблему. У меня на Windows 10 не возникало такой проблемы с крайними версиями SDL3 и полтора года назад тоже SDL3 работала нормально. Я использую SDL3, а SDL2 пробовал несколько раз. Я могу попробовать воспроизвести вашу проблему на Windows 10, подключив SDL2 указанной вами версии или другой версии. Какую версию SDL2 вы используете?

Я бы на вашем месте лучше бы использовал крайнюю версию SDL3 вместо SDL2, или чуть более раннюю версию SDL3, если вы не доверяете самым крайним версиям, потому что разработчики SDL несколько лет сфокусированы именно на SDL3 и это значит, что они более оперативно могут ответить в Issues на GitHub: https://github.com/libsdl-org/SDL/issues Если не хотите сразу Issue создавать, то спросите на их официальном Discord-сервере (Discord запрещён в РФ), где много активных разработчиков самой SDL, или на официальном форуме SDL. У них очень активный форум, Issues и т.д. Может это какой-то хитрый баг SDL2 на Linux какой-то специфической версии SDL2 и возможно этот баг был исправлен в более поздних версиях SDL2 или SDL3.

SDL3, в отличает от SDL2, легко запускать на платформах: Android, Desktop и Web. Разработчики SDL3 официально поддерживают ещё множество других платформ. В официальном репозитории есть множество примеров: examples/renderer/01-clear/clear.c на языке Си по 2D API SDL3, например, смена цвета фона по таймеру:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 * This example code creates an SDL window and renderer, and then clears the
 * window to a different color every frame, so you'll effectively get a window
 * that's smoothly fading between colors.
 *
 * This code is public domain. Feel free to use it for any purpose!
 */
 
#define SDL_MAIN_USE_CALLBACKS 1  /* use the callbacks instead of main() */
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
 
/* We will use this renderer to draw into this window every frame. */
static SDL_Window *window = NULL;
static SDL_Renderer *renderer = NULL;
 
/* This function runs once at startup. */
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
{
    SDL_SetAppMetadata("Example Renderer Clear", "1.0", "com.example.renderer-clear");
 
    if (!SDL_Init(SDL_INIT_VIDEO)) {
        SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
        return SDL_APP_FAILURE;
    }
 
    if (!SDL_CreateWindowAndRenderer("examples/renderer/clear", 640, 480, SDL_WINDOW_RESIZABLE, &window, &renderer)) {
        SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
        return SDL_APP_FAILURE;
    }
    SDL_SetRenderLogicalPresentation(renderer, 640, 480, SDL_LOGICAL_PRESENTATION_LETTERBOX);
 
    return SDL_APP_CONTINUE;  /* carry on with the program! */
}
 
/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
{
    if (event->type == SDL_EVENT_QUIT) {
        return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */
    }
    return SDL_APP_CONTINUE;  /* carry on with the program! */
}
 
/* This function runs once per frame, and is the heart of the program. */
SDL_AppResult SDL_AppIterate(void *appstate)
{
    const double now = ((double)SDL_GetTicks()) / 1000.0;  /* convert from milliseconds to seconds. */
    /* choose the color for the frame we will draw. The sine wave trick makes it fade between colors smoothly. */
    const float red = (float) (0.5 + 0.5 * SDL_sin(now));
    const float green = (float) (0.5 + 0.5 * SDL_sin(now + SDL_PI_D * 2 / 3));
    const float blue = (float) (0.5 + 0.5 * SDL_sin(now + SDL_PI_D * 4 / 3));
    SDL_SetRenderDrawColorFloat(renderer, red, green, blue, SDL_ALPHA_OPAQUE_FLOAT);  /* new color, full alpha. */
 
    /* clear the window to the draw color. */
    SDL_RenderClear(renderer);
 
    /* put the newly-cleared rendering on the screen. */
    SDL_RenderPresent(renderer);
 
    return SDL_APP_CONTINUE;  /* carry on with the program! */
}
 
/* This function runs once at shutdown. */
void SDL_AppQuit(void *appstate, SDL_AppResult result)
{
    /* SDL will clean up the window/renderer for us. */
}
Код будет выглядеть одинаково на всех поддерживаемых платформах.
1
9036 / 2937 / 493
Регистрация: 05.10.2013
Сообщений: 7,960
Записей в блоге: 216
08.12.2025, 12:52
Цитата Сообщение от 8Observer8 Посмотреть сообщение
SDL3, в отличает от SDL2, легко запускать на платформах
Я допустил грубую орфографическую ошибку. Надо было написать "в отличИе".

Uko1ove, когда вы позже будете переходить на графические API, то вы можете остаться на SDL и не переучиться на другую библиотеку. SDL не только имеет свой 2D API, на котором можно попрактиковаться в программировании на Си и технологиях на простых 2D-игрушках, но и поддерживает создание окна для чистых графических API, например, OpenGL и Vulkan. Если возникла "странность" в поведении библиотеки, то это не повод её менять. Тем более вы знаете, как эту проблему обойти. Это повод докопаться до истины, например, через разработчиков SDL на их официальном *Discord-сервере, GitHub Issues и т.д. Мне не понравилась GLFW прежде всего тем, что у неё остался в основном только один отвечающий на официальном форуме: https://discourse.glfw.org/ Этот же человек в 99% случаев занимается Issues. Откройте почти любой issue и вы его увидите: https://github.com/glfw/glfw/issues У GLFW нет официального *Discord-сервера. Я считаю, что это очень плохо, когда в основном на одном человеке держатся Issues и официальный форум. Если вы откроете GitHub-репозиторий SDL, официальный форум или официальный *Discord-сервер SDL, то увидите, как много активных разработчиков SDL там. В отличие от GLFW, SDL официально поддерживает Android, HTML5/WebGL/WebGPU и множество других платформ, которые GLFW официально не поддерживает.

Я в 2022 году решал проблему с ограничением FPS на GLFW, на официальном форуме, начиная с этого сообщения. У GLFW нет эквивалента SDL_Delay(), поэтому приходилось использовать костыль-функцию кроссплатформенной задержки, что сильно плохо для создания примеров для туториалов для начинающих в блоге:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * Cross-platform sleep function for C
 * @param int milliseconds
 */
void sleep_ms(int milliseconds)
{
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    usleep(milliseconds * 1000);
#endif
}
У SDL3 есть SDL_GPU. Я не пробовал, потому что лично мне более чем достаточно шейдерного OpenGL 2.1 для Desktop и OpenGL ES 2.0 для Android и Web, но по описанию SDL_GPU выглядит очень интересно. Я спросил у Gemini, что это такое:

SDL_GPU — это новый, низкоуровневый программный интерфейс (API), который был объединен с основной библиотекой и стал частью SDL3.

Его основное назначение — предоставить разработчикам кроссплатформенный доступ к современным графическим API, таким как Vulkan, Direct3D 12, Metal, WebGPU и другим, через единый, упрощенный интерфейс.

Ключевые особенности и отличия SDL_GPU:
  • Абстракция современных API: В отличие от SDL2, который в основном использовал более старый API OpenGL или высокоуровневый и ограниченный SDL_Render, SDL3 с SDL_GPU предлагает унифицированный способ использования современных низкоуровневых графических интерфейсов.
  • Производительность и контроль: SDL_GPU разработан с учетом философии современных API, требующих более явного управления ресурсами (например, буферами команд и данными), что позволяет разработчикам достигать более высокой производительности и лучшего контроля над тем, как данные перемещаются между оперативной памятью (CPU) и видеопамятью (GPU).
  • Поддержка 3D-графики и шейдеров: Если предыдущий SDL_Render был ориентирован в основном на 2D-графику, то SDL_GPU позволяет реализовывать сложную 3D-графику, использовать вычислительные шейдеры (compute shaders), множественные цели рендеринга и другие функции, необходимые современным движкам.
  • Снижение "Boilerplate" кода: По сравнению с прямым программированием на чистом Vulkan или Direct3D 12, SDL_GPU значительно уменьшает количество шаблонного (boilerplate) кода, необходимого для инициализации и базовой работы, сохраняя при этом низкий уровень абстракции.

Простыми словами: SDL_GPU — это инструмент в SDL3, который позволяет разработчикам писать высокопроизводительный графический код, который автоматически работает на всех современных платформах и использует лучшие доступные на них технологии рендеринга.
SDL используется во многих известных приложениях, например, в эмуляторе PS1 (PlayStation) - DuckStation. SDL используется в движке Source 2 от компании Valve, на котором были сделаны игры: Dota 2, Counter-Strike 2 (CS2), Half-Life: Alyx и т.д.

Ответ от Gemini:

SDL (Simple DirectMedia Layer) используется движком Source 2 как кроссплатформенная прослойка (слой абстракции)

Valve использует SDL для того, чтобы упростить перенос своих игр на разные операционные системы (в частности, на Linux и macOS). SDL берет на себя низкоуровневые, специфичные для каждой ОС задачи, такие как:
  • Создание и управление окном приложения.
  • Обработка ввода (клавиатура, мышь, геймпады).
  • Управление аудио.
  • Управление графическим контекстом (позволяет движку использовать OpenGL, Vulkan или DirectX поверх окна, созданного SDL).

Резюме:
  • Основа игр: Движок Source 2.
  • Роль SDL: Вспомогательная библиотека, которая обеспечивает совместимость игр на разных платформах, обрабатывая базовые системные функции и ввод/вывод.
*Discord - запрещён в РФ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2025, 12:52
Помогаю со студенческими работами здесь

Виснет программа при компиляции, степовер не работает, так же виснет
Виснет программа при компиляции, степовер не работает, так же виснет. Программа - простейший...

Отсутствуют синие точки перед рядом строк при отладке. Пропускаются эти строки при выполнении
При попытке пошагово выполнить программу перед некоторыми строками отсутствуют синие точки....

SDL и задержка движения персонажа при зажатии клавиши
Всем доброго времени суток. Изучаю библиотеку SDL и возникла такая проблема: при зажатии клавиши...

SDL: Нарушение прав доступа при работе с рендером
Есть следующее приложение: Programm.h #include &lt;windows.h&gt; #include &lt;SDL.h&gt; #include...

Ошибка компилятора gcc при использовании библиотека SDL в C
Здравствуйте. Программа Putpixel, которая строит три вложенных окружности разного цвета: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru