簡體   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