X11 qt5.6.2 程序运行一段时间后卡死/不刷新/(死机)(_XReply)

2024-02-28 16:38

本文主要是介绍X11 qt5.6.2 程序运行一段时间后卡死/不刷新/(死机)(_XReply),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

X11 qt5.6.2 程序运行一段时间后卡死/不刷新/(死机)(_XReply)

硬件:
飞凌 imx6dl 开发板
软件:
linux 4.1.15 X11 qt5.6.2

问题的现象:
QT应用程序运行一段时间后会卡死(界面不刷新), 此时, top命令可以看到程序进程还在,cpu占用率为0 (图中Impella进程), 内核状态也正常,内存资源看起来也正常, 触摸屏事件也能捕捉到,再运行其他qt程序也可以工作,唯独跑了一段时间后的Impella卡死了。
复现时间间隔不固定,可能两到三小时,或者一到两天。
在这里插入图片描述
解决过程:
问题debug了 很久,基于对开发板厂商的信任, 一开始 怀疑QT 程序内有死锁,或陷入睡眠,死循环等。
测试发现死锁或者睡眠,的现象与问题的现象一致,都是进程卡死,cpu占用率为0
死循环 也会导致卡死,但是cpu占用率很高,与问题不一致,
梳理代码后我认为,死锁,或陷入睡眠,死循环的概率很小。 代码中没有用信号量或者sleep等

又开始怀疑 是不是某槽函数阻塞导致假死, 一段时间百度折腾后,网上答案五花八门,都没解决我的问题。

最后想到用gdb去查看程序卡死时的状态,调用栈等。
程序卡死后,我们可以gdb attach 程序对应的pid
然后通过 bt full查看程序调用栈,

(gdb) bt full
#0 0x75e5fa0c in pthread_cond_wait () from /lib/libpthread.so.0
No symbol table info available.
#1 0x75856b3c in _XReply () from /usr/lib/libX11.so.6
No symbol table info available.
#2 0x758593e4 in ?? () from /usr/lib/libX11.so.6
No symbol table info available.
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

从上面log可以看到, 程序卡死时,进入了自下往上 _XReply () > pthread_cond_wait
最终陷入了等待, 原来是 libX11 的锅。

查看 libX11 的问题记录发现, 官方在1.6.9以后的版本中都修复了此问题,
https://gitlab.freedesktop.org/xorg/lib/libx11/-/merge_requests/13/diffs

Avoid recursing through _XError due to sequence adjustment This patch is based on research done by Dmitry Osipenko to uncover the
cause of a large class of Xlib lockups.

_XError must unlock and re-lock the display around the call to the user error handler function. When re-locking the display, two
functions are called to ensure that the display is ready to generate a
request:

_XIDHandler(dpy);
_XSeqSyncFunction(dpy);

The first ensures that there is at least one XID available to use
(possibly calling _xcb_generate_id to do so). The second makes sure a
reply is received at least every 65535 requests to keep sequence
numbers in sync (possibly generating a GetInputFocus request and
synchronously awaiting the reply).

If the second of these does generate a GetInputFocus request and wait
for the reply, then a pending error will cause recursion into _XError,
which deadlocks the display.

One seemingly easy fix is to have _XError avoid those calls by
invoking InternalLockDisplay instead of LockDisplay…

1.7.0版本中又进行了调整如下:
https://gitlab.freedesktop.org/xorg/lib/libx11/-/commit/30ccef3a48029bf4fc31d4abda2d2778d0ad6277

Avoid recursing through _XError due to sequence adjustment This patch
is based on research done by Dmitry Osipenko to uncover the cause of a
large class of Xlib lockups.

_XError must unlock and re-lock the display around the call to the user error handler function. When re-locking the display, two
functions are called to ensure that the display is ready to generate a
request:

_XIDHandler(dpy);
_XSeqSyncFunction(dpy);

The first ensures that there is at least one XID available to use
(possibly calling _xcb_generate_id to do so). The second makes sure a
reply is received at least every 65535 requests to keep sequence
numbers in sync (possibly generating a GetInputFocus request and
synchronously awaiting the reply).

If the second of these does generate a GetInputFocus request and wait
for the reply, then a pending error will cause recursion into _XError,
which deadlocks the display.

One seemingly easy fix is to have _XError avoid those calls by
invoking InternalLockDisplay instead of LockDisplay…

解决方法:

我目前的bsp中的libX11 版本 是 1.6.3 ,
所以把libX11 的版本更新到 1.6.9 以上的版本即可
我最终选择更新到当前最新版本1.7.2
libX11 源码下载地址
https://www.x.org/releases/individual/lib/

我一般都对平台比较信任的,但出了问题,就纯纯要人命啊。 希望此记录能帮助有缘人避坑。

这篇关于X11 qt5.6.2 程序运行一段时间后卡死/不刷新/(死机)(_XReply)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756021

相关文章

ubuntu16.04 Git add 使用tab键卡死

以前使用Ubuntu14.04 进行git add 操作时使用TAB键可以很快自动补全,但自从使用16.04使用TAB半天没有反应。 一开始以为是Git版本问题,后验证与Git无关。 搜索发现与Dash有关,以下是博客原文: http://www.51testing.com/html/50/n-1245050.html 今天碰到一个问题git 后面的参数用Tab键无法补全

一个C++程序运行,从点击运行到控制台打印文本,电脑硬件的资源是如何调动的

当点击运行一个 C++ 程序并看到控制台输出文本时,计算机硬件和操作系统之间协同工作,完成了多个步骤。这些步骤涉及 CPU、内存、存储设备、操作系统和输入输出设备的共同作用。下面是一个详细的过程描述: 1. 程序加载 启动:当你点击运行一个可执行文件时,操作系统(通常是 Windows、Linux 或 macOS)的文件系统管理器识别请求,并启动加载程序。读取可执行文件:加载程序将可执行文件从

linux下查看您当前是 Xorg(X11) 还是 Wayland方法

linux下查看您当前是 Xorg(X11) 还是 Wayland方法 方法如下(都是终端执行): echo $XDG_SESSION_TYPE 如果输出为wayland,则当前在 Wayland 环境中。 如果输出为x11,则当前在 X11 环境中。 或者 systemctl status display-manager 或者 loginctl show-session $(lo

maven项目中程序运行编译的时候出现:编码GBK的不可映射字符

由于JDK是国际版的,我们在用javac.exe编译时,编译程序首先会获得我们操作系统默认采用的编码格式(也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格

自定义布局实现listview上拉加载下拉刷新

listview布局有时加载数据偏多,需要上拉加载第二页等更多数据,下拉刷新数据等功能,也有开源的框架XRefreshView ,可以参考http://www.w2bc.com/Article/44291,当初开发项目时,便于自己控制,就自定义布局实现这功能。 1、自定义布局用来管理三个子控件:下拉头,包含内容的自定义listview,上拉头(代码有详细介绍) public class Pul

学习记录-Qt按键单击后延迟一段时间触发下一个函数执行

<span style="font-family: Arial, Helvetica, sans-serif;">QTimer::singleShot(1000, this, SLOT(on_pushButton_pcba_readfilename_clicked()));</span>项目中,需要按键单击后发送一条指令,等待一段时间后在发另一条指令,看文档发现使用如上方式可以实现

vue列表数据删除后刷新页面

目录 背景页面刷新方式1.原始方法2.vue自带的路由跳转3.重新调用获取数据列表的接口4.使用provide和inject实现页面刷新使用方式总结 背景 在页面进行增删改列表后,页面需要进行刷新,在进行这些操作后,需要手动刷新才能更新列表。本文主要讨论进行增删改查相关操作后如何使当前页面显示操作后的最新数据。 参考:vue实现在进行增删改操作后刷新页面 页面刷新方式

Ubuntu UI卡死

Ubuntu运行时间长了,UI时而卡死,鼠标指针能移动,但是键盘鼠标任何输入UI无反馈。 系统时间从UI上看,也是停顿状态。 由于卡顿之前,打开的程序比较多,不敢冒然强行拔电。 这时参考下帖提到的关键命令: sudo pkill Xorg或者sudo restart lightdm   远程ssh登录到本机或者ctrl + alt + f1进入到tty1命令行模式(切记,不要尝试ctrl

button 提交后再次刷新页面

button,input type=button按钮在IE和w3c,firefox浏览器区别 当在IE浏览器下面时,button标签按钮,input标签type属性为button的按钮是一样的功能,不会对表单进行任何操作。 但是在W3C浏览器,如Firefox下就需要注意了,button标签按钮会提交表单,而input标签type属性为button不会对表单进行任何操作。 解决方案:

C1-2 ABB二次SDK开发——手把手教登录对应的机器人控制器(图片引导操作)登录机器人控制器和刷新机器人列表

1.完成配置后我们开始进行操作 C1-1 ABB二次SDK开发——C#Window窗体-环境配置(带ABB二次开发SDK资源包)-CSDN博客文章浏览阅读95次。3.记住路径,右键C#引用,然后导入ABB.Robotics.Controllers.PC.dll。2.安装资源文件PCABB二次开发的SDK,并打开安装路径。1.新建VSC#的windowfrom项目。4.在框架代码主界面代码中添加。