繁体   English   中英

QT Creator:程序在调试模式下崩溃,但在发布模式和调试模式下工作,带有基于QThread的程序的断点

[英]QT Creator : Program crashes in debug mode but working in Release mode and in DEBUG Mode with breakpoints for QThread based program

我正在基于桌面(Windows 7)的应用程序上工作,并使用Qt Creator v 5.6.0开发本程序。 我有一个很奇怪的问题,即

  1. 我的程序在DEBUG模式下崩溃,但在RELEASE模式下运行良好。

  2. 如果处于调试模式,并且我放置了断点以查找崩溃的原因,那么它不会崩溃:它可以正常工作。 但是,如果我不放置任何断点,则会在下面的代码中崩溃:

项目背景:“我的项目”具有以下功能:从系统通信端口上连接的设备读取数据,并将数据传输到MainWindow UI进行显示。 由于要与通信端口进行通信,我们必须使用第三方库,因此我不使用QtSerial Port类,该类更加简单易用。

代码设计:类MainClass:在此类中,我们创建了一些表格来显示从设备读取的数据。

类TestClass:此类将处理与系统串行端口上连接的设备的所有通信,并使用第三方库。 此类还具有while循环,可从串行端口连接的设备读取数据。

由于测试类正在使用while循环。 因此,我们决定使Test Class在不同的线程中运行。

在MainClass构造函数中创建线程的代码:

MainClass::MainClass (QWidget *parent) : QDialog(parent),
    ui(new Ui::Analzyer)
{
   ............................
   ............................

   workerThread = new QThread;
   testClassObject = new TestClass();   // Declared in HeaderFile of MainClass        

    if((workerThread != NULL) && (testClassObject != NULL))
    {
        workerThread ->moveToThread(testClassObject );

        connect(workerThread , SIGNAL(started()), testClassObject, SLOT(SomeFunc()));
        connect(testClassObject, SIGNAL(exit()), workerThread , SLOT(quit()));
        connect(testClassObject, SIGNAL(exit()), testClassObject,  SLOT(deleteLater()));
        connect(workerThread , SIGNAL(finished()), workerThread , SLOT(deleteLater()));

        // connectToPort Signal is emitted when User clicks the pushbutton from   // Main class UI
        connect(this, SIGNAL(connectToPort(QString)), testClassObject, SLOT(openPort(QString)));
    }

}

崩溃代码:

void TestClass::openPort(const QString portName)
{
    // Here portName is say : "Appliance Interface v2"
    quint32 param2 = getParam2ForPortName(portName);
    qint16 portNumber = 0;

    QByteArray portNameByteArray = portName.toLatin1();

    const char *portNameToOpen = portNameByteArray.data();

     // Program crashed when return from this function
    if(func1(portNameToOpen , param2, 10 , &portNumber) == true)
    {
             ......................
             ......................
    }
}

在这里,我添加了一些qDebug(),发现我的代码在从插槽OpenPort()中调用或调用func1()返回时崩溃。 下面是func1()的原型

bool func1 (const char portDescription[], uInt32 param2,
               uInt16 length, Int16 * portNr);

由于func1()是库代码的一部分。 因此,我无法检查功能func1()的定义。 我可以确保func1()中没有问题,因为它已在基于Java的不同项目中使用,并且可以正常工作。

我在项目上进行了更多的调试,发现在带有BreakPoints的DEBUG模式下运行时,与在QT Thread Debug窗口中相比,我可以看到连接的插槽,但是当我没有放置任何BreakPoint时,我的代码就会崩溃并在Qt Thread Debug窗口中我看不到连接的插槽

因此,它看起来是openPort插槽的主类和测试类之间的连接问题。

但是当我在operPort()函数中设置断点时,我无法理解,而不是在Qt Thread Debug窗口中看到openPort Slot,但是在Qt Thread Debug Window和Program Crashs中看不到openPort Slot断点的情况。

请建议,

我可以确保func1()中没有问题,因为它已在基于Java的不同项目中使用,并且可以正常工作。

等一下,func1()是C ++还是Java?
另外,您如何确定它有效?
获取库源代码,自己编译,然后在其中调试。
并且,请确保在调试时检查变量的值,并在不进行调试时检查它们的qDebug()

很抱歉在我自己的帖子上进行回复,但是在对StackOverflow和Google进行了多次讨论之后。 我能够解决问题。

解决此问题:我如下所述更改了SLOT(openPort):

Connect(this, SIGNAL(connectToPort(QString)), testClassObject, SLOT(openPort(QString)), Qt::DirectConnection); 

那就是使用“ Qt:DirectConnection”方法。 如果我们未指定连接方法,则直接方法将自动用于SAME线程上的对象之间的连接。 从这里开始,我们为TestClass创建了一个新的QThread并使用了thirdParty库,该库可能不是线程安全的。 因此,使用“ Qt :: DirectConnection”使openPort()SlOT在MainClass Thread中运行。 基本上,就像发出信号一样,直接调用slot方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM