在Lubuntu16.04的x11vnc中运行GTKmm程序遇断言失败及段错误
解决Lubuntu 16.04 x11vnc环境下GTKmm程序启动段错误问题
这种在x11vnc环境下GTKmm程序启动就崩的问题我碰到过不少,核心原因都是GTK没法正确获取X服务器的屏幕资源,先给你拆解下错误和对应的解决办法:
错误原因解析
你看到的这几个断言错误和段错误,本质是:
gtk_settings_get_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed:GTK尝试获取屏幕设置时,传入的screen对象无效,说明程序没正确连接到X服务器的屏幕资源- 后续的
g_object_get_qdata断言失败是前面错误的连锁反应,最终因为访问无效内存触发段错误 - 段错误发生在
main第一行之前,大概率是全局/静态对象在GTK初始化前就调用了GTK相关函数,或者X环境变量配置错误导致GTK初始化失败
分步解决办法
1. 确认DISPLAY环境变量正确设置
x11vnc是共享现有X会话,必须让GTK程序知道要连接哪个X服务器:
- 先在终端执行
echo $DISPLAY,正常应该输出:0(Lubuntu默认X会话的display号) - 如果输出为空或者不是
:0,手动设置:
然后再启动你的GTKmm程序export DISPLAY=:0
2. 确保x11vnc正确连接到活跃X会话
Lubuntu 16.04用的是LightDM显示管理器,启动x11vnc时需要指定正确的认证文件,否则无法获取屏幕权限:
x11vnc -display :0 -auth /var/run/lightdm/root/:0
如果找不到这个认证文件,可以用x11vnc -findauth命令自动查找
3. 用最小GTKmm程序验证环境
先排除程序本身的问题,写一个极简测试程序:
#include <gtkmm.h> int main(int argc, char* argv[]) { auto app = Gtk::Application::create(argc, argv); Gtk::Window window; window.set_title("GTKmm Test"); return app->run(window); }
编译运行:
g++ test.cpp -o test `pkg-config gtkmm-3.0 --cflags --libs` ./test
如果这个程序能正常弹出窗口,说明环境没问题,问题出在你的原程序里;如果同样崩溃,那就是x11vnc的X环境配置有问题
4. 检查程序中的全局/静态GTK对象
段错误发生在main之前,几乎都是因为全局或静态对象在构造时调用了GTK函数(比如创建控件、获取设置),这时候GTK还没完成初始化(Gtk::Application::create还没执行)。
解决办法:
- 把全局GTK对象改成指针,在
main里初始化完GTK后再创建 - 或者用懒加载的方式,第一次使用时再初始化这些对象
5. 分析core dump定位问题
如果以上方法都没解决,启用core dump来找到具体崩溃点:
- 先允许生成core dump:
ulimit -c unlimited - 重新运行程序,触发段错误后会生成
core文件 - 用gdb分析:
输入gdb ./your-program-name corebt查看调用堆栈,就能看到是哪个静态初始化的代码导致了崩溃
内容的提问来源于stack exchange,提问作者CreFroD
相关产品推荐
相关产品推荐

