데스크톱 (Windows 7) 기반 응용 프로그램에서 작업하고 Qt Creator v 5.6.0을 사용하여 프로그램. 난 아주 이상한 문제를 디버그 모드에서 즉QT Creator : 프로그램이 디버그 모드에서 충돌하지만 릴리스 모드 및 QThread 기반 프로그램의 중단 점이있는 디버그 모드에서 작동
내 프로그램 충돌이 있지만 RELEASE 모드에서 작동합니다.
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 슬롯보다 중단 점이 표시되지 않을 때입니다. 충돌.
는 친절 추천
디버거에서 이진을 실행하지만 중단 점은 설정하지 않습니다. 충돌의 정확한 라인과 이유는 무엇입니까 (디버거 메시지)? – Murphy
안녕하십니까, 아래처럼 연결 (this, SIGNAL (connectToPort (QString)), testClassObject, SLOT (openPort (QString))과 같은 DirectConnection Type을 사용하면 중단 점없이 Qt 디버그 모드에서 충돌을 해결할 수 있습니다. Qt :: 직접 연결); Qt :: DirectConnection 유형을 사용하여 BreakPoints (충돌하지 않을 때)와 RELEASE (충돌하지 않을 때) 모드로 변경되는 내용을 여전히 이해할 수 없습니까? 제발 제안 해주세요. – learner
이후 Qt :: DirectConnection이 중단 점없이 디버거 모드에서 중단 점 및 RELASE 모드로 작동하는 이유는 정확히 알지 못합니다. 그래서 나는이 질문에 대답 할 수없고 그것을 가까운 것으로 표시 할 수 없다. – learner