为啥我的 Qt 应用程序无故崩溃? [关闭]
Posted
技术标签:
【中文标题】为啥我的 Qt 应用程序无故崩溃? [关闭]【英文标题】:Why is my Qt Application crashing without reason? [closed]为什么我的 Qt 应用程序无故崩溃? [关闭] 【发布时间】:2012-12-26 12:47:41 【问题描述】:我正在编写一个中型应用程序,用于存储基于 sqlite 数据库的数据。我创建了一个对话框来将数据添加到数据库中。在保存数据之前,它会检查一些条件以确保输入的数据是有效的。这是一个简单的散文。并且容易发现故障。我很高兴他们没有错误地使应用程序崩溃。应用程序也编译没有错误。有时它运行良好,但大多数探测它会崩溃并关闭。
我的第一个问题是为什么会发生这种事情。 (有时它运行良好,有时它在相同的条件下崩溃)。
如何在这种情况下查找故障。简单来说,我就是用改逻辑改代码,以为会改二进制改错。
例如:-
if(query.exec())
//codes here.
我将把这段代码替换为
bool ok=query.exec();
if(ok)
//code here....
请在这种情况下帮助我,我将不胜感激任何建议。我将添加使应用程序崩溃的newMember.h
和newMember.cpp
。 (这是我的new member
对话框的类)。如果需要更多数据,请告诉我,我也会添加它们。
在错误报告中,在错误签名中提到了ModName:qtgui4.dll , Offset: 000c14e6
newMember.h
#ifndef NEWMEMBER_H
#define NEWMEMBER_H
#include "ui_newmember.h"
class newMember : public QDialog, private Ui::newMember
Q_OBJECT
private:
QString path_1;
QPixmap pic;
public:
newMember(QString str, QWidget *parent );
public slots:
void browse();
void save_2();
;
#endif // NEWMEMBER_H
newMember.cpp
#include "newmember.h"
#include<QtGui>
#include<QtSql/QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
newMember::newMember(QString str, QWidget *parent)
setupUi(this);
lineEdit_7->setText(str);
radioButton->setChecked(true); ;
connect(pushButton,SIGNAL(clicked()),this,SLOT(browse()));
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(save_2()));
void newMember::browse()
path_1=QFileDialog::getOpenFileName(this,"choose an image for the new house", QString::null,"Image Files (*.jpg *.bmp)");
pic.load(path_1);
pic=pic.scaled(284,213,Qt::KeepAspectRatio, Qt::SmoothTransformation);
label_14->setPixmap(pic);
QString input1(QString str)
if(str=="")
return "-NA-";
else
return str;
void newMember::save_2()
QByteArray array;
QBuffer buf(&array);
buf.open( QIODevice::WriteOnly);
pic.save(&buf,"jpg");
QString mof;
if(radioButton->isChecked())mof="male";
if(radioButton_2->isChecked())mof="female";
QString isgm="false";
if(checkBox->isChecked())isgm="true";
QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("data");
db.open();
QSqlQuery query;
query.exec("create table members(aname text, homeno text, namein text, fname text, onames text, nic text, sex text, bday text,gm text,occupation text,contactno text,qulification text,note text, img BLOB) ");
if(lineEdit_8->text()=="")
QMessageBox::about(this,"error","you should enter a name to identify this member \n within the specific house");
return;
query.prepare("select aname from members where homeno=? and aname=? ");
query.bindValue(0,lineEdit_7->text());
query.bindValue(1,lineEdit_8->text());
query.exec();
if(query.next())
QMessageBox::about(this, "error", "the name you entered to identify this member \n is already available, please enter another one") ;
return;
if(isgm=="true")
query.prepare("select aname from members where homeno=? and gm=?");
query.bindValue(0,lineEdit_7->text());
query.bindValue(1,"true");
query.exec();
if(query.next())
QMessageBox::about(this, "error", "there is a gruha mulikaya set already");
return;
query.prepare("insert into members(aname, homeno , namein , fname , onames , nic , sex , bday ,gm ,occupation ,contactno ,qulification ,note ,img) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?) ");
query.bindValue(0,lineEdit_8->text());
query.bindValue(1,input1(lineEdit_7->text()));
query.bindValue(2,input1(lineEdit->text()));
query.bindValue(3,input1(lineEdit_2->text()));
query.bindValue(4,input1(lineEdit_3->text()));
query.bindValue(5,input1(lineEdit_4->text()));
query.bindValue(6,mof);
query.bindValue(7,dateEdit->date().toString("yyyy-MM-dd") );
query.bindValue(8,isgm);
query.bindValue(9,input1(lineEdit_5->text()));
query.bindValue(10,input1(lineEdit_6->text()));
query.bindValue(11,input1(textEdit->toPlainText()));
query.bindValue(12,input1(textEdit_2->toPlainText()));
query.bindValue(13,array);
bool ok=query.exec();
if(!ok)
QSqlError error;
error=query.lastError();
QMessageBox::about(this,"error",error.text() );
else
QMessageBox::about(this,"message","data added successfully");
newMember::close();
【问题讨论】:
在调试器中运行应用程序,它会告诉你它在哪里崩溃。 我对调试 Qt 应用程序一无所知。无论如何我会尝试的。并给出结果。谢谢。 @NikosC。在应用程序输出中,它告诉The program has unexpectedly finished.
在该行之前它有 4 行为 QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
很抱歉在调试器中它没有给出任何错误,它按预期工作。在上面的评论中它不在调试器中,我只是从 QtCreater 运行它。在调试器中运行时它不会崩溃。 @NikosC。
对于“重复连接”问题,您应该将打开数据库的代码移到构造函数中,使其只执行一次(详见that answer)。
【参考方案1】:
-
尝试在调试器下运行您的应用程序。它将显示您的应用程序在代码中崩溃的位置。在您的情况下,这可能是段错误。
为什么不检查返回值?
【讨论】:
查看我上面的评论,这是我的调试器输出。它们不是检查代码中的返回值的重要点,不是吗。什么是段错误。请帮忙 Segfault == 分段错误 == 访问冲突。您在尝试访问处理器无法寻址的内存时收到。例如:引用空指针。 很抱歉在调试器中它没有给出任何错误,它按预期工作。在上面的评论中它不在调试器中,我只是从 QtCreater 运行它。在调试器中运行时不会崩溃。 谢谢。我接受你的回答以上是关于为啥我的 Qt 应用程序无故崩溃? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章