2016-09-12 2 views
1

데스크톱 (Windows 7) 기반 응용 프로그램에서 작업하고 Qt Creator v 5.6.0을 사용하여 프로그램. 난 아주 이상한 문제를 디버그 모드에서 즉QT Creator : 프로그램이 디버그 모드에서 충돌하지만 릴리스 모드 및 QThread 기반 프로그램의 중단 점이있는 디버그 모드에서 작동

  1. 내 프로그램 충돌이 있지만 RELEASE 모드에서 작동합니다.

  2. DEBUG 모드에서 충돌 원인을 찾기 위해 중단 점을 넣으면 충돌이 발생하지 않습니다. 올바르게 작동합니다.

프로젝트 배경 : 그때 어떤 브레이크 포인트를 넣어하지 않는 경우 그러나 그것은 코드 아래에 충돌 내 프로젝트는 시스템의 통신 포트에 연결된 장치에서 읽기 기능을 포함하고 표시 할 MainWindow를 UI에 데이터를 전송 . 통신 포트와 통신하기 때문에 타사 라이브러리를 사용해야하므로 QtSerial Port 클래스를 사용하지 않고 훨씬 간단하고 사용하기 쉽습니다.

코드 디자인 : 클래스 MainClass :이 클래스에서 우리는 장치에서 읽은 데이터를 표시하기위한 몇 가지 양식을 만들었습니다.

클래스 TestClass :이 클래스는 시스템 직렬 포트에 연결된 장치와의 모든 통신을 처리하고 타사 라이브러리를 사용합니다. 이 클래스에는 직렬 포트에 연결된 장치에서 데이터를 읽는 while 루프도 있습니다.

테스트 클래스는 while 루프를 사용하기 때문에. 그래서 우리는 테스트 클래스를 다른 스레드에서 실행하기로 결정했습니다. 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()에서 func1, 이후

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

()의 프로토 타입 라이브러리 코드의 일부이다. 그래서 함수 func1()의 정의를 검사 할 수 없습니다. func1()에 문제가 없다는 것을 확신 할 수 있습니다. 다른 Java 기반 프로젝트에서 사용되고 있기 때문에 작동합니다.

나는 프로젝트에서 좀 더 디버깅을 한 결과, QT 스레드 디버그 창에서보다 디버그 모드에서 디버그 모드로 실행하면 연결된 슬롯을 볼 수 있지만 내 코드가 충돌하는 것보다 breakPoint를 놓지 않은 경우 Qt 스레드 디버그 창 연결된 슬롯이 보이지 않습니다.

OpenPort Slot의 주 클래스와 테스트 클래스 간의 연결 문제가 있습니다.

그러나 operPort() 함수에 중단 점을 넣을 때 이해할 수 없습니다. Qt 스레드 디버그 창에서 내 openPort 슬롯을 볼 수 있지만 Qt 스레드 디버그 창과 프로그램에서 openport 슬롯보다 중단 점이 표시되지 않을 때입니다. 충돌.

는 친절 추천

+0

디버거에서 이진을 실행하지만 중단 점은 설정하지 않습니다. 충돌의 정확한 라인과 이유는 무엇입니까 (디버거 메시지)? – Murphy

+0

안녕하십니까, 아래처럼 연결 (this, SIGNAL (connectToPort (QString)), testClassObject, SLOT (openPort (QString))과 같은 DirectConnection Type을 사용하면 중단 점없이 Qt 디버그 모드에서 충돌을 해결할 수 있습니다. Qt :: 직접 연결); Qt :: DirectConnection 유형을 사용하여 BreakPoints (충돌하지 않을 때)와 RELEASE (충돌하지 않을 때) 모드로 변경되는 내용을 여전히 이해할 수 없습니까? 제발 제안 해주세요. – learner

+0

이후 Qt :: DirectConnection이 중단 점없이 디버거 모드에서 중단 점 및 RELASE 모드로 작동하는 이유는 정확히 알지 못합니다. 그래서 나는이 질문에 대답 할 수없고 그것을 가까운 것으로 표시 할 수 없다. – learner

답변

0

I가 서로 다른 자바 기반 프로젝트에 사용하고 작동 중이므로 FUNC1의 문제는()이 없다는 것을 보장 할 수있다.

대기, func1() C++ 또는 Java입니까?
또한 어떻게 작동하는지 확인할 수 있습니까?
라이브러리 소스를 가져 와서 직접 컴파일하고 디버깅하십시오. 나는 내 자신의 게시물에 회신뿐만에 StackOverflow과 구글에 dicussion의 많은 후 사과

+0

이것은 대답이 아닌 주석이어야합니다. [this] (https://meta.stackexchange.com/questions/17447/answer-orment-whats-the-etiquette)를 참조하십시오. – Mike

+0

나는 대답으로 더 나은 것 같아요, 오류는 아마도 자신의 변수 또는 func1() 함수 중 하나입니다 –

+0

답장을 보내 주셔서 감사합니다. func1()은 사용중인 라이브러리의 * .h 헤더 파일에 선언되어 있습니다. func1()은이 헤더 파일을 가진 동일한 라이브러리가 다른 데스크탑 응용 프로그램에서 사용 되었기 때문에 작동한다고 말할 수 있습니다.하지만 이는 Java에 있습니다. 거기 제대로 작동합니다. 만약 내가 코드가 제대로 작동보다 중단 점을 추가합니다. 나는 qDebug()를 추가하고 func1() 안의 qDebug()와 openPort() func의 리턴 값을 볼 수 없었다. 충돌 지점을 찾기 위해 func1()이 표시되기 전에 만 나타났습니다. – learner

0

디버깅을하지 않을 경우
그리고, 단지 확인하기 위해 디버깅하는 동안, 당신의 변수의 값을 확인하고 qDebug()을. 문제를 해결할 수있었습니다.

문제를 해결하려면 아래 바와 같이 I 슬롯 (openPort)를 변경 :

은 "Qt는 : DirectConnection"사용하는
Connect(this, SIGNAL(connectToPort(QString)), testClassObject, SLOT(openPort(QString)), Qt::DirectConnection); 

방법. 연결 메소드를 지정하지 않으면 직접 메소드가 SAME 스레드의 오브젝트 간 연결에 자동으로 사용됩니다. 여기에서 우리는 TestClass를위한 새로운 QThread를 만들고 쓰레드에 안전하지 않을 수도있는 thirdParty 라이브러리를 사용했다. 그래서 "Qt :: DirectConnection"을 사용하여 openPort() Slot을 MainClass Thread에서 실행하십시오. 기본적으로 신호를 방출하는 것처럼 슬롯 메서드를 "직접"호출합니다.

관련 문제