如何通过命令行获取进程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交互界面中执行:gdb -p <PID>
注:此方法只能获取当前活跃的上下文,无法枚举进程内所有上下文。# 获取当前显示连接和上下文 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
相关产品推荐
相关产品推荐

