Qt5程序常规调试方法总结

1.使用qDebug打印关键信息,在程序输出窗口进行查看,如:

void QtAppDebug::on_pushButton_clicked() 
{
    
    
    qDebug() << "---QtAppDebug---" << endl; 
}

在这里插入图片描述

2.使用QMessageBox显示关键信息,在程序运行过程中通过窗口查看,如:

void QtAppDebug::on_pushButton_clicked()
{
    
    
    QMessageBox::information(this,"Test","---QtAppDebug---");
}

在这里插入图片描述

3.对可疑代码进行注释,按模块函数顺序逐步缩小范围,精准定位出bug代码,如:

void QtAppDebug::on_pushButton_clicked() 
{
    
    
#if 0
    QMessageBox::information(this,"Test","---QtAppDebug---");
#endif
}

4.qtcreator使用F10,F11,F5进行单步调试,查看程序运行过程中关键数据信息;

5.打印调试信息到日志文件中进行分析,使用示例,更全面系统日志框架可学习Log4Qt ;

6.调试复杂界面显示时,可以设置控件颜色清晰查看控件大小及边界,如下:

void QtAppDebug::on_pushButton_clicked()
{
    
    
    ui->pushButton->setStyleSheet("background-color:red");
}

在这里插入图片描述

7.添加异常捕获代码,崩溃时生成dump文件,根据dump文件进行分析定位,如下:

//异常捕获函数
long ApplicationCrashHandler(EXCEPTION_POINTERS *pException){
    
    
    {
    
    
        // 在程序exe的上级目录中创建dmp文件夹
        QDir *dmp = new QDir;
        bool exist = dmp->exists("../dmp/");
        if(exist == false)
            dmp->mkdir("../dmp/");
    }
    QDateTime current_date_time = QDateTime::currentDateTime();
    QString current_date = current_date_time.toString("yyyy_MM_dd_hh_mm_ss");
    QString time =  current_date + ".dmp";
    EXCEPTION_RECORD *record = pException->ExceptionRecord;
    QString errCode(QString::number(record->ExceptionCode, 16));
    QString errAddr(QString::number((uint)record->ExceptionAddress, 16));
    QString errFlag(QString::number(record->ExceptionFlags, 16));
    QString errPara(QString::number(record->NumberParameters, 16));
    qDebug()<<"errCode: "<<errCode;
    qDebug()<<"errAddr: "<<errAddr;
    qDebug()<<"errFlag: "<<errFlag;
    qDebug()<<"errPara: "<<errPara;
    HANDLE hDumpFile = CreateFile((LPCSTR)QString("../dmp/" + time).utf16(),
                                  GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hDumpFile != INVALID_HANDLE_VALUE) {
    
    
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
        CloseHandle(hDumpFile);
    }
    else{
    
    
        qDebug()<<"hDumpFile == null";
    }
    return EXCEPTION_EXECUTE_HANDLER;
}```
//注冊异常捕获函数
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);

猜你喜欢

转载自blog.csdn.net/oTianLe1234/article/details/114025766