#include "mainwindow.h" #include #include //#include #include "ccrashstack.h" //#include "DbgHelp.h" #ifdef Q_OS_WIN long __stdcall callback(_EXCEPTION_POINTERS* excp){ CCrashStack crashStack(excp); QString sCrashInfo = crashStack.GetExceptionInfo(); // TCHAR my_documents[MAX_PATH]; // SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, my_documents); // QString file_path = QString::fromWCharArray(my_documents); QDir dir; QString file_path = dir.currentPath(); QDir *folder_path = new QDir; bool exist = folder_path->exists(file_path.append("\\MyApp")); if(!exist) folder_path->mkdir(file_path); delete folder_path; folder_path = nullptr; QFile file("d:\\mycrash.log"); if(file.open(QIODevice::WriteOnly|QIODevice::Truncate)){ file.write(sCrashInfo.toUtf8()); file.close(); } QMessageBox::critical(NULL,"程式崩溃","
程序崩溃,请将d盘根目录下的mycrash.log文件发送到fyx@xixunled.com邮箱
研发人员会尽快处理修改程序bug,并给出解决方案", QMessageBox::Ok); return EXCEPTION_EXECUTE_HANDLER; } #endif //static LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException) //{ // //And output crash information // 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: "<
对于发生的错误,表示诚挚的歉意
"+ // QString("
错误代码:%1
错误地址:%2
").arg(errCode).arg(errAddr), // QMessageBox::Ok); // return EXCEPTION_EXECUTE_HANDLER; //} //主程序入口 int main(int argc, char *argv[]){ QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); SetUnhandledExceptionFilter(callback); //步骤3: //通过qt命令行进入 执行命令: //objdump -S xxx.exe >aaa.asm //命令执行完成后,根据步骤2中获得的crash堆栈信息在aaa.asm中查找响应地址,即可得到崩溃具体位置。 // SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler); // 在项目的proproject文件里增加:QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG // 这句话的目的是Release版也将生成“.pdb”后缀的调试信息文件。在使用WinDbg导入Dump前。指定好源代码与pdb文件的位置。就可以在错误报告内看到罪魁祸首是哪一行代码。 QApplication a(argc, argv); QSplashScreen *splash = new QSplashScreen; splash->setPixmap(QPixmap(":/res/splash.png")); splash->show(); //Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop; splash->showMessage(QObject::tr("Setting up the LedOK Express...") , Qt::AlignRight | Qt::AlignTop , Qt::white); /* JQHttpServer::TcpServerManage tcpServerManage( 2 ); // 设置最大处理线程数,默认2个 tcpServerManage.setHttpAcceptedCallback( []( const QPointer< JQHttpServer::Session > &session ) { // 回调发生在新的线程内,不是主线程,请注意线程安全 // 若阻塞了此回调,那么新的连接将不会得到处理(默认情况下有2个线程可以阻塞2次,第3个连接将不会被处理) // session->replyText( QString( "url:%1\nbody:%2" ).arg( session->requestUrl(), QString( session->requestBody() ) ) ); // session->replyRedirects( QUrl( "http://www.baidu.com" ) ); // session->replyJsonObject( { { { "message", "ok" } } } ); QString strRequestUrl=session.data()->requestUrl(); if(strRequestUrl.contains("/download?id=")) { QString strId=strRequestUrl.right(strRequestUrl.length()-13); session->replyFile( "C:/Users/64549/Documents/LedOK Express/NPrograms/新建20200330111731834_tmp/"+strId ); } //session->replyJsonArray( { "a", "b", "c" } ); // session->replyFile( "G://11.o" ); // session->replyImage( QImage( "/Users/jason/Desktop/Test.png" ) ); // session->replyBytes(QByteArray(4,'\x24')); // $$$$ // 注1:因为一个session对应一个单一的HTTP请求,所以session只能reply一次 // 注2:在reply后,session的生命周期不可控,所以reply后不要再调用session的接口了 } ); qDebug() << "listen:" << tcpServerManage.listen( QHostAddress::Any, 23412 ); splash->showMessage(QObject::tr("httpserver listen...") , Qt::AlignRight | Qt::AlignTop , Qt::white); */ MainWindow w; //splash->showMessage(QObject::tr("Loading modules..."),Qt::AlignRight | Qt::AlignTop ,Qt::white); //loadModules(); //splash->showMessage(QObject::tr("Establishing connections..."),Qt::AlignRight | Qt::AlignTop ,Qt::white); //establishConnections(); splash->showMessage(QObject::tr("Setting up the LedOK Express OK!") , Qt::AlignRight | Qt::AlignTop , Qt::white); w.show(); splash->finish(&w); delete splash; return a.exec(); }