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

如何在任意X11环境下实现程序崩溃时的消息框提示?

纯X11实现崩溃提示消息框及UTF-8支持方案

一、X11中处理UTF-8文本

X11原生不直接支持UTF-8,但可通过Xlib国际化函数将UTF-8转换为X11兼容的文本格式:

  • 使用XmbTextListToTextProperty函数,结合系统locale把UTF-8字符串转为XTextProperty结构,该结构可直接用于设置窗口标题、绘制文本等场景。
  • 代码片段示例:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <locale.h>

XTextProperty utf8_to_xtext(Display *dpy, const char *utf8_str) {
    XTextProperty prop;
    char *str_list[] = {(char*)utf8_str};
    int count = 1;
    setlocale(LC_ALL, "");
    XmbTextListToTextProperty(dpy, str_list, count, XUTF8StringStyle, &prop);
    return prop;
}

二、纯X11实现崩溃时的消息框

要在程序崩溃(如触发SIGSEGV、SIGABRT等信号)时显示消息框,需通过信号处理函数创建极简X11窗口:

  1. 注册信号处理函数:捕获崩溃信号,在处理逻辑中启动X11窗口创建流程。
  2. 极简消息框实现:创建固定尺寸窗口,设置标题与提示文本,等待用户交互关闭,全程仅依赖Xlib,无需高层GUI组件。

代码框架示例:

#include <X11/Xlib.h>
#include <signal.h>
#include <stdio.h>

Display *dpy;
Window win;
GC gc;

// 崩溃信号处理函数
void crash_handler(int sig) {
    // 初始化X显示(未初始化时执行)
    if (!dpy) {
        dpy = XOpenDisplay(NULL);
        if (!dpy) {
            fprintf(stderr, "无法连接X服务器\n");
            return;
        }
    }

    int screen = DefaultScreen(dpy);
    Window root = RootWindow(dpy, screen);
    XSetWindowAttributes attr;
    attr.background_pixel = WhitePixel(dpy, screen);
    attr.event_mask = ExposureMask | ButtonPressMask;

    // 创建窗口
    win = XCreateWindow(dpy, root, 100, 100, 400, 150, 1,
                        DefaultDepth(dpy, screen), InputOutput,
                        DefaultVisual(dpy, screen), CWBackPixel | CWEventMask, &attr);

    // 设置UTF-8标题
    XTextProperty title_prop = utf8_to_xtext(dpy, "程序崩溃提示");
    XSetWMName(dpy, win, &title_prop);
    XFree(title_prop.value);

    // 创建绘图上下文
    gc = XCreateGC(dpy, win, 0, NULL);
    XSetForeground(dpy, gc, BlackPixel(dpy, screen));

    XMapWindow(dpy, win);
    XFlush(dpy);

    // 事件循环:等待用户点击关闭
    XEvent ev;
    while (1) {
        XNextEvent(dpy, &ev);
        if (ev.type == Expose) {
            // 绘制UTF-8提示文本
            XmbDrawString(dpy, win, DefaultFont(dpy, screen), gc, 20, 50,
                          "程序发生崩溃,请检查日志或重启。", -1);
        } else if (ev.type == ButtonPress) {
            break;
        }
    }

    // 清理资源
    XFreeGC(dpy, gc);
    XDestroyWindow(dpy, win);
    XCloseDisplay(dpy);
    exit(1);
}

int main() {
    // 注册崩溃信号
    signal(SIGSEGV, crash_handler);
    signal(SIGABRT, crash_handler);

    // 主程序逻辑...
    // 模拟崩溃:*(int*)0 = 0;

    return 0;
}

三、关键注意事项

  • 信号处理函数中避免调用非异步安全函数,上述实现已尽量简化Xlib操作,降低风险。
  • 编译时需链接X11库:gcc your_code.c -o your_program -lX11
  • UTF-8文本绘制依赖系统字体支持,确保目标系统安装了兼容UTF-8的字体。

内容的提问来源于stack exchange,提问作者Felix.leg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:32:41