QT线程引发Backtrace stopped: previous frame identical to this frame (corrupt stack?)

本文探讨了在QTGUI应用程序中,将UI刷新操作置于线程内导致的界面不刷新、程序假死及异常退出等问题。通过详细分析,发现错误在于线程中调用了update()函数,正确的做法是将UI刷新操作保留在主线程中。文章提供了调试过程及解决方案,避免类似问题的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介

由于在主线程以及多线程中对GUI进行绘画刷新,导致了出现莫名其妙的问题。例如:
1、在程序运行了一段时间后,程序UI不会刷新,运行的获取当前程序时间的程序一直在运行,但是不会将当前时间显示到界面上,其他后台显示信息,一切正常。经过鼠标的再次点击,程序会暂时恢复正常或者是直接程序终止退出。

2、出现QT gui界面假死现象(即是后台显示程序运行正常,结果是界面一直不刷新,并且top查看进行使用时,显示占用cpu 0.0%)

3、程序进程突然退出,后台gdb调试core dump文件打印如下:
 

1.	Core was generated by `qtgui'.  
2.	Program terminated with signal 6, Aborted.  
3.	#0  0xb6e04f1c in raise () from /lib/libc.so.0  
4.	(gdb) bt  
5.	#0  0xb6e04f1c in raise () from /lib/libc.so.0  
6.	#1  0xb6dff52c in abort () from /lib/libc.so.0  
7.	#2  0xb6dfed68 in ?? () from /lib/libc.so.0  
8.	#3  0xb6dfed68 in ?? () from /lib/libc.so.0  
9.	Backtrace stopped: previous frame identical to this frame (corrupt stack?)  
10.	(gdb)  

原因在QT的run函数中调用了一个fun1函数,而fun1函数调用update()函数(这个用来刷新界面)

void my_pthread::run()
{
    while (1) {
        fun1();
    }
}

void widget::fun1()
{
    //对Qlable显示图像的一些操作
    update();
}

结论:经过多个方面连续两天的调试,才发现原来是不小心将消息状态更新接口写在更新线程里面,在此之前,已经设计为线程只是用作消息的获取,刷新界面等操作,主要还是放在主进程里面,线程获取的消息,通过信号和槽,通知主进程进行相应的刷新显示。所以在此,再次强调不能将UI刷新放在线程上面,必须放在主进程里面,切记,切记,切记!!!

2. 原因

在此,贴上相关资料:
线程中的事件循环使线程可以使用某些需要存在事件循环的非GUI Qt类(例如QTimer,QTcpSocket和QProcess)

Qt 5.6 Threads and QObjects

3.参考链接

  1. http://www.qtcn.org/bbs/simple/?t61849.html
  2. https://blog.csdn.net/wb175208/article/details/82634466
  3. https://ask.csdn.net/questions/151609
  4. https://blog.csdn.net/quange_style/article/details/90696417

 

 

 

 

 

 

 

 

 

 

 

thread apply all bt Thread 13 (Thread 0xab8f9380 (LWP 1787) "FileInfoThread"): #0 0xb5aa15e8 in ?? () from /lib/libc.so.6 #1 0xb5aa4d48 in pthread_cond_wait () from /lib/libc.so.6 #2 0xb5ddf38c in QWaitCondition::wait(QMutex*, QDeadlineTimer) () from /home/txj/ut0712/UI/..//qt5.12/lib/libQt5Core.so.5 #3 0xb5ddf4d8 in QWaitCondition::wait(QMutex*, unsigned long) () from /home/txj/ut0712/UI/..//qt5.12/lib/libQt5Core.so.5 #4 0xad03eea8 in ?? () from /home/txj/ut0712/qt5.12/qml/Qt/labs/folderlistmodel/libqmlfolderlistmodelplugin.so Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 12 (Thread 0xae1fc380 (LWP 1752) "ptl_lgprov"): #0 0xb5b11218 in poll () from /lib/libc.so.6 #1 0xb58e71d0 in ?? () from /usr/lib/libglib-2.0.so.0 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 11 (Thread 0xae9fd380 (LWP 1751) "ucf_thread_sfq"): #0 0xb5b1a20c in syscall () from /lib/libc.so.6 #1 0xb5ddaefc in ?? () from /home/txj/ut0712/UI/..//qt5.12/lib/libQt5Core.so.5 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 10 (Thread 0xaf1fe380 (LWP 1750) "ucf_thread_eng"): #0 0xb5adca7c in __clock_nanosleep_time64 () from /lib/libc.so.6 #1 0xb5aa10bc in ?? () from /lib/libc.so.6 #2 0xb62660ec in ?? () from /home/txj/ut0712/UI/..//qt5.12/lib/libQt5Core.so.5 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 9 (Thread 0xaf9ff380 (LWP 1749) "ucf_thread_tcp"): #0 0xb5adca7c in __clock_nanosleep_time64 () from /lib/libc.so.6 #1 0xb5aa10bc in ?? () from /lib/libc.so.6 #2 0xb62660ec in ?? () from /home/txj/ut0712/UI/..//qt5.12/lib/libQt5Core.so.5 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 8 (Thread 0xb03ff380 (LWP 1748) "ucf_thread_chnl"): #0 0xb5adca7c in __clock_nanosleep_time64 () from /lib/libc.so.6 #1 0xb5aa10bc in ?? () from /lib/libc.so.6 #2 0xb62660ec in ?? () from /home/txj/ut0712/UI/..//qt5.12/lib/libQt5Core.so.5 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 7 (Thread 0xb0dfe380 (LWP 1747) "UIPDataSource"): #0 0xb5b11218 in poll () from /lib/libc.so.6 #1 0xb58e71d0 in ?? () from /usr/lib/libglib-2.0.so.0 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 6 (Thread 0xb15ff380 (LWP 1746) "UCF_Tick"): #0 0xb5b11218 in poll () from /lib/libc.so.6 #1 0xb58e71d0 in ?? () from /usr/lib/libglib-2.0.so.0 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 5 (Thread 0xb21bd380 (LWP 1745) "UIPComm_Rx"): #0 0xb5b11218 in poll () from /lib/libc.so.6 #1 0xb58e71d0 in ?? () from /usr/lib/libglib-2.0.so.0 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 4 (Thread 0xb29be380 (LWP 1744) "UIPComm_Tx"): #0 0xb5b1a20c in syscall () from /lib/libc.so.6 #1 0xb5ddaefc in ?? () from /home/txj/ut0712/UI/..//qt5.12/lib/libQt5Core.so.5 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 3 (Thread 0xb3bff380 (LWP 1743) "QQmlThread"): --Type <RET> for more, q to quit, c to continue without paging-- #0 0xb5b11218 in poll () from /lib/libc.so.6 #1 0xb58e71d0 in ?? () from /usr/lib/libglib-2.0.so.0 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 2 (Thread 0xb4600380 (LWP 1742) "QEvdevTouchScre"): #0 0xb5b11218 in poll () from /lib/libc.so.6 #1 0xb58e71d0 in ?? () from /usr/lib/libglib-2.0.so.0 Backtrace stopped: previous frame identical to this frame (corrupt stack?) Thread 1 (Thread 0xb6fb7220 (LWP 1741) "UI_Loader"): #0 0xb5b11218 in poll () from /lib/libc.so.6 #1 0xb58e71d0 in ?? () from /usr/lib/libglib-2.0.so.0 Backtrace stopped: previous frame identical to this frame (corrupt stack?) (gdb) (gdb)
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值