Qt编程中诡异的段错误

原创 2007年09月16日 21:40:00
编程中让人郁闷的事情莫过于段错误(也就是传说中的Core dumped),让人更郁闷的情况是有时候段错误,有时候又不段错误。而基于第三方库开发的应用程序,当出现段错误时,更是难以调试,因为段错误的代码可能是在库代码中,这导致GDB工具也无法给出有用的调试信息。
要是真碰到这种情况,只能仰天长叹了!
前几天在把Opencv和Qt4结合起来,完成从摄像头捕捉视频,并显示出来的问题时,就遇到了这种段错误。出现段错误时给出的出错信息如下:
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 8086cc8. Receiver '' (of type 'QSocketNotifier') was created in thread 8052280", file kernel/qcoreapplication.cpp, line 253
忽略 (core dumped)
以前只用Opencv完成这部分功能的时候,用到了Boost线程库实现的多线程,让视频显示部分的代码在一个新线程中执行,主线程就不会被阻塞。现在用Opencv结合Qt4来实现这部分功能,多线程部分就使用了QThread。(重载QThread的run())

void MyThread::run()...{
    QImage image;
    signal 
= VIDEO_PAUSE;
    
while((pImage = cvQueryFrame(pCapture)) != NULL)...{
        
if(signal == VIDEO_START)...{
            cvWriteFrame(videowriter, pImage);
            emit RenderImage(IplImageToQImage(pImage));
        }

        
else if(signal == VIDEO_STOP)
            
break;
        cvWaitKey(
2);
    }

}

原本的程序是在循环里面用update()发出一个paintEvent()事件来刷新图像的,后来看了错误信息,知道了事件是不能在两个线程之间发送的,于是通过发送信号signal/slot的方式来实现目的,即上述线程向主线程发送一个signal(带QImage),主线程接收这个信号并在本线程内update()一个paintEvent()事件,这样一来,就不会在两个线程之间发送事件了。
本以为问题就此解决,可以洗个脚回去睡觉了!结果还是段错误,而且错误信息也还是一样。于是其后有一段时间都在自我否定中,让我对开始的一系列推理和做法将信将疑。
在其后长达n个小时的时间里,我试着去掉一些代码,来看看是否会有段错误的发生,结果依然还是段错误。终于后来感动上天....
那一夜,俱乐部,包宿....就在11点多钟的时候:
我把cvWaitKey(2)去掉,然后编译,运行程序,运行了一分多钟没有出现段错误,但我还不能确信,因为有时候就是跑了一分多钟才段错误的,于是我一直等着...结果终于没有再段错误了。
原因分析:在Opencv窗口显示中需要包含cvWaitKey(?)否则窗口无法显示出来,因此我一直认为在Qt中显示,它也应该需要。不想竟是它出了问题,cvWaitKey(?)调用了系统定时器,因此可能会向该进程的所有线程发送一个事件,于是便导致了在两个线程之间发送事件的错误。

段错误调试方法

1.Compile your application with -g, then you’ll have debug symbols in the binary file. 2.Use gdb to...

c/c++/qt中的段错误(segment fault)

关于内存的那些话就不说了,被一帮会装会转载的人说烂了 这里只说我在写程序时遇到段错误的原因,如何解决的 总之一句话,涉及到指针的,你不能在未定义,未初始化,未 “new” 之前使用,否则等待你的肯...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

qt 段错误,简单调试方法

qt 段错误,简单调试方法 如果Qt程序不大也不小,有些地方难免会出现声明指针后没有具体实现的情况。这种情况下Qt在编译阶段是不会出现错误的,但是运行的时候会出现“段错误”,其他什么都不会显示。 ...

Qt编程中诡异的段错误

转自:http://blog.csdn.net/icesorrow/article/details/1787491 编程中让人郁闷的事情莫过于段错误(也就是传说中的Core dumped),让人更郁...

linux下C编程free()时出现飘忽诡异的段错误(核心已转储)问题

先说一下问题现场。 代码如下 free(volthisframe->Tops); free(volthisframe->Bots); printf("what\n"); free(volth...

VS2015和QT5.5项目出现的诡异错误(LNK2001和LNK09)的解决办法

VS2015和QT5.5项目出现的诡异错误(LNK2001和LNK2109)的解决办法 今天要把一个旧的QT项目移植到VS2015和QT5.5.1的环境下,没想到出现了诡异的错误,发费了不少时间才找到...

Qt之网络编程错误总结

最近在做Qt网络编程,主要是项目需要,学习下Qt下网络编程的多线程实现。  1。 QTcpSocket 中的connectToHost() 是void类型的,所以调用这个函数后无论是否连上就发送数...

Qt编程常见编译错误及解析

转载自:http://blog.chinaunix.net/space.php?uid=21454189&do=blog&id=442244 0.预备知识:编译-运行一个c/c++程序时,编...

git遇到的诡异错误: Failed connect to github.com:443

我的linux系统突然不能访问github了,找了好久,试了各种方法,终于发现这篇文章中出现的情况和我一模一样! 特此转载记录下,感谢原博主。原文链接无法访问github 为什么会...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt编程中诡异的段错误
举报原因:
原因补充:

(最多只允许输入30个字)