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

如何通过命令行获取进程GLX上下文列表以对比应用创建方式

获取进程的GLX上下文列表(命令行方式)

以下是几种直接通过命令行/工具链获取进程GLX上下文信息的方法,适合对比不同应用的上下文创建逻辑:

1. 用ld_preload注入追踪上下文创建

这是最适合对比的方式,能实时捕获应用创建GLX上下文时的参数细节:

  • 编写一个简单的拦截库(比如glxtrace.c),拦截glXCreateContext、glXCreateContextAttribsARB等核心创建函数:
    #include <GL/glx.h>
    #include <stdio.h>
    #include <dlfcn.h>
    
    // 定义原函数指针类型
    typedef GLXContext (*glXCreateContextFunc)(Display*, XVisualInfo*, GLXContext, Bool);
    typedef GLXContext (*glXCreateContextAttribsARBFunc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
    
    glXCreateContextFunc real_glXCreateContext;
    glXCreateContextAttribsARBFunc real_glXCreateContextAttribsARB;
    
    // 拦截glXCreateContext
    GLXContext glXCreateContext(Display*dpy, XVisualInfo*vis, GLXContext share_list, Bool direct) {
        GLXContext ctx = real_glXCreateContext(dpy, vis, share_list, direct);
        printf("[GLX Trace] Created context: %p | Visual ID: %d | Direct render: %d\n", 
               ctx, vis->visualid, direct);
        return ctx;
    }
    
    // 拦截glXCreateContextAttribsARB(现代应用常用)
    GLXContext glXCreateContextAttribsARB(Display*dpy, GLXFBConfig config, GLXContext share_list, Bool direct, const int* attribs) {
        GLXContext ctx = real_glXCreateContextAttribsARB(dpy, config, share_list, direct, attribs);
        printf("[GLX Trace] Created ARB context: %p | Direct render: %d\n", ctx, direct);
        return ctx;
    }
    
    // 初始化函数,加载原函数地址
    void __attribute__((constructor)) init() {
        real_glXCreateContext = (glXCreateContextFunc)dlsym(RTLD_NEXT, "glXCreateContext");
        real_glXCreateContextAttribsARB = (glXCreateContextAttribsARBFunc)dlsym(RTLD_NEXT, "glXCreateContextAttribsARB");
    }
    
  • 编译为共享库:
    gcc -fPIC -shared -o libglxtrace.so glxtrace.c -ldl -lGL
    
  • 运行目标应用时注入该库,即可实时输出上下文创建信息:
    LD_PRELOAD=./libglxtrace.so <你的应用程序名>
    

2. 用gdb附加进程查看当前上下文

针对已运行的进程,可以通过调试器直接调用GLX API获取上下文信息:

  • 先获取进程PID:
    pidof <应用名>  # 或 pgrep <应用名>
    
  • 附加到进程并执行GLX相关查询:
    gdb -p <PID>
    
    在gdb交互界面中执行:
    # 获取当前显示连接和上下文
    set $display = glXGetCurrentDisplay()
    set $ctx = glXGetCurrentContext()
    
    # 打印上下文基本信息
    print *$ctx
    # 查询上下文的视觉ID
    print glXQueryContext($display, $ctx, GLX_VISUAL_ID)
    
    注:此方法只能获取当前活跃的上下文,无法枚举进程内所有上下文。

3. 用xrestop查看X资源关联

xrestop可以展示X服务器中各进程的资源占用,包括GLX上下文相关条目:

  • 安装工具(以Debian/Ubuntu为例):
    sudo apt install xrestop
    
  • 运行xrestop,找到目标进程后,查看其GLX分类下的资源条目,可看到上下文的引用计数、关联视觉信息等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:51:57