Why program crash when USB port changes?
-
Hi ,
I have got a strange issue, and I'm banging my head to debug it!
I have got a serial device connected to the PC.
I have a button called "log" when clicked, it goes to the following slot and basically does some file manipulations.
When I was testing this, it all worked fine.
Now reconnect the device to a different USB port, now when I click to open the "log" the program crashes.
This happens only when reconnecting the device to a different USB port.
When I tried to debug it it shows the message:

I can see it is something related to a range of a QList. But I don't know why the program crashes and throw this message in some USB ports!??
And other parts of the program works fine (I mean program crashes only when I click the log button)here is what I'm doing when "log" button is clicked
void StageOneMain::on_pushButton_log_clicked() { QString namestring = "log_file_"+pLabel; QString filename = "logfilename.txt"; QString newfilename = "log_file_"+pLabel+".txt"; QFile originalFile(filename), newFile(newfilename); if(!originalFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Error opening original log file: "<<originalFile.errorString(); } QTextStream instream(& originalFile); QRegExp rx("(\\ |\\,|\\.|\\:|\\t)"); QRegExp regExp_int (QLatin1Literal("[^0-9]+")); // reg ex to extract integer from a string if(newFile.open(QIODevice::WriteOnly|QIODevice::Text)) { QTextStream outstream(& newFile); outstream<<"Date and Time of last log access: "<<QDateTime::currentDateTime().toString()<<"\n\n"; // to add date and time outstream<<"Stimulator serial port details: "<<"\n\n"; foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { QString s = QObject::tr("Port: ") + info.portName() + "\n" + QObject::tr("Description: ") + info.description() + "\n" + QObject::tr("Manufacturer: ") + info.manufacturer() + "\n" + QObject::tr("Vendor Identifier: ") + (info.hasVendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString()) + "\n" + QObject::tr("Product Identifier: ") + (info.hasProductIdentifier() ? QString::number(info.productIdentifier(), 16) : QString()) + "\n"; outstream<<s<<'\n';} int linecount_1 = 0; while(linecount_1<6){ QString line = instream.readLine(); if(linecount_1== 0) { outstream <<line<< '\n'; } if(linecount_1== 1) { outstream <<line<< '\n'; } if(linecount_1== 2) { outstream <<line<< '\n'; } if(linecount_1== 3) { outstream <<line<< '\n'; } if(linecount_1== 4) { QStringList slist = line.split(regExp_int); qDebug()<<"Integer part of line 4"<<slist; int totTime = slist[1].toInt(); if(totTime > 60 && totTime < 3600) { slist[1] = QString::number(slist[1].toInt()/(60)); QString newline = "Power-on time: " + slist[1] +"min"; qDebug() << "newline: " << newline; outstream <<newline<< '\n'; } else if(totTime > 3600) { slist[1] = QString::number(slist[1].toInt()/(60*60)); QString newline = "Power-on time: " + slist[1]+"hrs"; qDebug() << "newline: " << newline; outstream <<newline<< '\n'; } else { QString newline = "Power-on time: " + slist[1] +"s"; qDebug() << "newline: " << newline; outstream <<newline<< '\n'; } } if(linecount_1== 5) { outstream <<line<< '\n'; } ++linecount_1; } int nb_line = 6; while(!instream.atEnd()) { QString line = instream.readLine(); if(nb_line == 6 ) { QString newline = "Phase\t\t\tCount\tMin time (s)\tMax time (s)\tTotal time (s)"; outstream <<newline<< '\n'; } if(nb_line == 7 ) { QStringList slist = line.split(rx); slist[0]= "Rest\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); outstream <<newline<< '\n'; } if(nb_line == 8 ) { QStringList slist = line.split(rx); slist[0]= "Hand open (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); outstream <<newline<< '\n'; } if(nb_line == 9 ) { QStringList slist = line.split(rx); slist[0]= "Finger Flexion (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 10 ) { QStringList slist = line.split(rx); slist[0]= "Grip Phase (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 11 ) { QStringList slist = line.split(rx); slist[0]= "Release Object (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 12 ) { QStringList slist = line.split(rx); slist[0]= "Hand open (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 13 ) { QStringList slist = line.split(rx); slist[0]= "Finger Flexion (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 14 ) { QStringList slist = line.split(rx); slist[0]= "Grip Phase (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 15 ) { QStringList slist = line.split(rx); slist[0]= "Release Object (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 16 ) { QStringList slist = line.split(rx); slist[0]= "Intensity (Key Grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 17 ) { QStringList slist = line.split(rx); slist[0]= "Intensity (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 18 ) { QStringList slist = line.split(rx); slist[0]= "Up (Key Grip)\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 19 ) { QStringList slist = line.split(rx); slist[0]= "Down (Key Grip)\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 20 ) { QStringList slist = line.split(rx); slist[0]= "Up (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 21 ) { QStringList slist = line.split(rx); slist[0]= "Down (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 22 ) { QStringList slist = line.split(rx); slist[0]= "Exercise phase\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } ++nb_line; } originalFile.close(); newFile.close(); //originalFile.remove(); } this->close() logwindow = new StimulatorLogWindow(pLabel, nullptr); logwindow -> setAttribute(Qt::WA_DeleteOnClose); logwindow -> show(); }Can anyone spot an issue here?
Apologies if my explanation is vague -
Hi ,
I have got a strange issue, and I'm banging my head to debug it!
I have got a serial device connected to the PC.
I have a button called "log" when clicked, it goes to the following slot and basically does some file manipulations.
When I was testing this, it all worked fine.
Now reconnect the device to a different USB port, now when I click to open the "log" the program crashes.
This happens only when reconnecting the device to a different USB port.
When I tried to debug it it shows the message:

I can see it is something related to a range of a QList. But I don't know why the program crashes and throw this message in some USB ports!??
And other parts of the program works fine (I mean program crashes only when I click the log button)here is what I'm doing when "log" button is clicked
void StageOneMain::on_pushButton_log_clicked() { QString namestring = "log_file_"+pLabel; QString filename = "logfilename.txt"; QString newfilename = "log_file_"+pLabel+".txt"; QFile originalFile(filename), newFile(newfilename); if(!originalFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Error opening original log file: "<<originalFile.errorString(); } QTextStream instream(& originalFile); QRegExp rx("(\\ |\\,|\\.|\\:|\\t)"); QRegExp regExp_int (QLatin1Literal("[^0-9]+")); // reg ex to extract integer from a string if(newFile.open(QIODevice::WriteOnly|QIODevice::Text)) { QTextStream outstream(& newFile); outstream<<"Date and Time of last log access: "<<QDateTime::currentDateTime().toString()<<"\n\n"; // to add date and time outstream<<"Stimulator serial port details: "<<"\n\n"; foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { QString s = QObject::tr("Port: ") + info.portName() + "\n" + QObject::tr("Description: ") + info.description() + "\n" + QObject::tr("Manufacturer: ") + info.manufacturer() + "\n" + QObject::tr("Vendor Identifier: ") + (info.hasVendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString()) + "\n" + QObject::tr("Product Identifier: ") + (info.hasProductIdentifier() ? QString::number(info.productIdentifier(), 16) : QString()) + "\n"; outstream<<s<<'\n';} int linecount_1 = 0; while(linecount_1<6){ QString line = instream.readLine(); if(linecount_1== 0) { outstream <<line<< '\n'; } if(linecount_1== 1) { outstream <<line<< '\n'; } if(linecount_1== 2) { outstream <<line<< '\n'; } if(linecount_1== 3) { outstream <<line<< '\n'; } if(linecount_1== 4) { QStringList slist = line.split(regExp_int); qDebug()<<"Integer part of line 4"<<slist; int totTime = slist[1].toInt(); if(totTime > 60 && totTime < 3600) { slist[1] = QString::number(slist[1].toInt()/(60)); QString newline = "Power-on time: " + slist[1] +"min"; qDebug() << "newline: " << newline; outstream <<newline<< '\n'; } else if(totTime > 3600) { slist[1] = QString::number(slist[1].toInt()/(60*60)); QString newline = "Power-on time: " + slist[1]+"hrs"; qDebug() << "newline: " << newline; outstream <<newline<< '\n'; } else { QString newline = "Power-on time: " + slist[1] +"s"; qDebug() << "newline: " << newline; outstream <<newline<< '\n'; } } if(linecount_1== 5) { outstream <<line<< '\n'; } ++linecount_1; } int nb_line = 6; while(!instream.atEnd()) { QString line = instream.readLine(); if(nb_line == 6 ) { QString newline = "Phase\t\t\tCount\tMin time (s)\tMax time (s)\tTotal time (s)"; outstream <<newline<< '\n'; } if(nb_line == 7 ) { QStringList slist = line.split(rx); slist[0]= "Rest\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); outstream <<newline<< '\n'; } if(nb_line == 8 ) { QStringList slist = line.split(rx); slist[0]= "Hand open (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); outstream <<newline<< '\n'; } if(nb_line == 9 ) { QStringList slist = line.split(rx); slist[0]= "Finger Flexion (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 10 ) { QStringList slist = line.split(rx); slist[0]= "Grip Phase (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 11 ) { QStringList slist = line.split(rx); slist[0]= "Release Object (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 12 ) { QStringList slist = line.split(rx); slist[0]= "Hand open (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 13 ) { QStringList slist = line.split(rx); slist[0]= "Finger Flexion (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 14 ) { QStringList slist = line.split(rx); slist[0]= "Grip Phase (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 15 ) { QStringList slist = line.split(rx); slist[0]= "Release Object (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 16 ) { QStringList slist = line.split(rx); slist[0]= "Intensity (Key Grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 17 ) { QStringList slist = line.split(rx); slist[0]= "Intensity (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 18 ) { QStringList slist = line.split(rx); slist[0]= "Up (Key Grip)\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 19 ) { QStringList slist = line.split(rx); slist[0]= "Down (Key Grip)\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 20 ) { QStringList slist = line.split(rx); slist[0]= "Up (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 21 ) { QStringList slist = line.split(rx); slist[0]= "Down (Palmar Grasp)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } if(nb_line == 22 ) { QStringList slist = line.split(rx); slist[0]= "Exercise phase\t\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); QString newline = slist.join("\t"); // ui->textBrowser->append(newline); outstream <<newline<< '\n'; } ++nb_line; } originalFile.close(); newFile.close(); //originalFile.remove(); } this->close() logwindow = new StimulatorLogWindow(pLabel, nullptr); logwindow -> setAttribute(Qt::WA_DeleteOnClose); logwindow -> show(); }Can anyone spot an issue here?
Apologies if my explanation is vague@viniltc you do a bunch of splits of QString into QStringList - aka QList<QString> - and you do no checks, if the size of your list is actually the expected length. You simply access it via the [] operator.
I would start checking there
-
QStringList slist = line.split(rx); if(slist.size() >4) { slist[0]= "Grip Phase (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); } else { qDebug() << "Problem with string" << slist << line; } -
QStringList slist = line.split(rx); if(slist.size() >4) { slist[0]= "Grip Phase (Key grip)\t"; slist[2]= QString::number(slist[2].toInt()/(1000)); slist[3]= QString::number(slist[3].toInt()/(1000)); slist[4]= QString::number(slist[4].toInt()/(1000)); } else { qDebug() << "Problem with string" << slist << line; }