You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中运行SDL创建SDL_Renderer时冻结的问题求助

Docker容器中SDL创建渲染器冻结问题

问题概述

在Docker容器内运行SDL程序时,执行SDL_CreateRenderer创建渲染器的环节会出现冻结现象。该问题不仅存在于原生SDL中,基于SDL的Python框架如pygame也会出现类似情况。但同一容器内可以正常运行xeyes和简单tkinter应用,说明容器与主机X11显示的通信是正常的。

测试代码

C语言SDL测试程序(本地主机可正常运行)

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

int a = 0;

int main() {

    // Initialize SDL
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
        return 1;
    }
    printf("SDL initialized\n");

    // Create a window
    SDL_Window *window = SDL_CreateWindow("Pixel Drawing", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0);
    if (!window) {
        SDL_Log("Unable to create window: %s", SDL_GetError());
        SDL_Quit();
        return 1;
    }
    printf("Window created\n");

    // Create a renderer
    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if (!renderer) {
        SDL_Log("Unable to create renderer: %s", SDL_GetError());
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }
    printf("Renderer created\n");

    // Draw a rectangle (larger shape) instead of a single pixel
    SDL_Rect rect = {100, 100, 10, 10}; // x, y, width, height
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // Set color to red
    SDL_RenderFillRect(renderer, &rect); // Fill the rectangle with the specified color

    printf("Rectangle drawn\n");

    // Present renderer
    SDL_RenderPresent(renderer);

    // Wait for the user to close the window
    SDL_Event event;
    while (1) {
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
            break;
        }
    } 

    // Cleanup
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

使用的Dockerfile

# Dockerfile for sdl2 development

FROM debian

# Install normal dependencies
RUN set -eux; \
    apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        git \
        wget \
        zsh \
        vim \
        dbus-x11 \
        gdb \
        x11-apps \
        x11-utils \
        x11-xserver-utils \
        procps \
    && apt-get purge -y --auto-remove \
    && apt-get autoclean \
    && rm -rf /var/lib/apt/lists/* \
    && sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

# Install SDL2 dependencies
RUN set -eux; \
    apt-get update \
    && apt-get install -y --no-install-recommends \
        build-essential \
        libsdl2-dev

# Generating a universally unique ID for the Container
RUN dbus-uuidgen > /etc/machine-id

# Update the package list
RUN apt-get update -y && apt-get upgrade -y

WORKDIR /workspace

# Execute /workspace/app/test
CMD ["./app/test"]

系统调用追踪与验证

strace追踪结果

通过strace追踪发现,程序持续重复执行以下操作:

poll([{fd=4, events=POLLIN}], 1, -1)    = 1 ([{fd=4, revents=POLLIN}])
recvmsg(4, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="#\203\234\0\n\0\0\0\21\0\2\0\335\263(\0\0\0\0\0\17\0\2\0\0\0\0\0\0\0\0\0"..., iov_len=4096}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 72

文件描述符验证

通过ls -l /proc/PID/fd/4查看文件描述符4,结果为:

socket:[294329]

再通过ss -aen | grep 294329确认该socket连接的是X11服务器:

u_str ESTAB     0      213248                                                           /tmp/.X11-unix/X0 294330             * 294329 <-> ino:3145895 dev:0/49                          
u_str ESTAB     19848  0                                                                                * 294329             * 294330 <->

疑问

综上,程序在尝试与X11服务器通信但未收到响应,导致冻结。为何SDL程序在Docker中出现此问题,而其他X11应用可正常运行?


内容的提问来源于stack exchange,提问作者Initdd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:46:07