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开发该程序。我有一个很奇怪的问题,即
-
我的程序在DEBUG模式下崩溃,但在RELEASE模式下工作正常。
-
如果在DEBUG模式下,并且我放置断点来查找崩溃的原因,那么它不会崩溃:它正常工作。但是如果我没有设置任何断点,那么它会在以下代码处崩溃:
项目背景:我的项目包括从系统通信端口连接的设备读取并将数据传输到主窗口UI显示的功能。由于要与通信端口进行通信,我们必须使用第三方库,所以我不使用QtSerial port类,它更简单,更易于使用。
代码设计:在这个类中,我们创建了一些表单来显示从设备读取的数据。
类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(),并发现我的代码在从或调用func1()返回时崩溃,该函数在slot OpenPort()中被调用。下面是func1()
的原型bool func1 (const char portDescription[], uInt32 param2,
uInt16 length, Int16 * portNr);
因为func1()是库代码的一部分。所以我不能检查函数func1()的定义。我可以保证func1()没有问题,因为它被用于不同的基于java的项目,它的工作。
我在项目上做了一些更多的调试,并注意到,当在调试模式下运行断点比在QT线程调试窗口我可以看到我连接的插槽,但当我不把任何断点比我的代码崩溃,在QT线程调试窗口我看不到我连接的插槽
因此,它看起来是openPort Slot的主类和测试类之间的连接问题。
但是我无法理解,当我在operPort()函数中放置断点时,我可以在Qt线程调试窗口中看到我的openPort插槽,但是当没有断点时,openPort插槽在Qt线程调试窗口和程序崩溃中不可见。
请建议,
我可以保证func1()没有问题,因为它被用于不同的基于java的项目,它工作。
等等,func1()是c++还是Java ?
还有,你怎么能确定它能工作呢?
获取库源代码,自己编译,并在其中进行调试。
并且,为了确保,在调试时检查变量的值,在不调试
我很抱歉在我自己的帖子上回复,但在StackOverflow和google上进行了大量讨论之后。我能够解决这个问题。
解决方法:我更改了SLOT(openPort),如下所述:
Connect(this, SIGNAL(connectToPort(QString)), testClassObject, SLOT(openPort(QString)), Qt::DirectConnection);
即使用"Qt:DirectConnection"方法。如果我们没有指定连接方法,直接方法将自动用于同一线程中对象之间的连接。因为这里我们为TestClass创建了一个新的QThread,并使用了一个可能不是线程安全的thirdParty库。所以使用"Qt::DirectConnection"使openPort()插槽在MainClass线程中运行。基本上,就好像发出信号"直接"调用slot方法。
- 如何查询以确定我的 MacOS/X 应用程序是否处于应用程序午睡模式?
- Visual Studio 如何在内核模式驱动程序项目中使用C++标准库?
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- 当注入程序的内存空间时,如何读取从 0 到 0xFFFFFFFFF 的每个字节?我正在创建模式扫描仪
- 当某些应用程序处于全屏模式时,DesktopDuplication API会产生黑帧
- 在调试模式下,所有程序都运行良好,但在发布模式下,我在cudaMalloc操作中出错
- 多线程程序卡在优化模式下,但在 -O0 中正常运行
- 内核模式驱动程序可以在任何进程上执行读取进程内存吗?
- 从 c++ 应用程序打开可可模式窗口
- 微筛选器从用户模式应用程序接收常量值
- 当模式窗口最小化时,最小化所有应用程序窗口(在 Linux 上)
- 我如何调用在调试模式下具有主要的程序或代码
- 简单的内核模式驱动程序
- 混合模式程序集是针对版本 'v2.0.50727' 构建的 ...本机C++/Visual C++/C# 项目错误
- 如何创建一个新过程,而没有从管理模式运行的MFC应用程序中的管理特权
- 混合模式程序集(C++/CLI项目)在.NET Core上工作吗
- C++控制台模式程序在 Mac 上产生不同的结果到 Windows
- 从用户模式程序在 Windows 上发送和接收 ARP 数据
- 强制用户模式程序在非分页内存下运行
- 在新托管线程中通过 C# 在混合模式程序集中调用 STL 矢量的push_back