!1 add Components/CrashStackTrace/
Merge pull request !1 from RigoLigo/N/A
This commit is contained in:
		
						commit
						5f5cb4ede1
					
				
							
								
								
									
										58
									
								
								Components/CrashStackTrace/handler.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								Components/CrashStackTrace/handler.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,58 @@
 | 
			
		||||
  QString WriteStackTrace(const QString &aStackTrace)
 | 
			
		||||
  {
 | 
			
		||||
    QString path = QDir::homePath() + "/.local/share/spark-store/crash/";
 | 
			
		||||
    QFile StackTraceFile;
 | 
			
		||||
    if(!QDir().exists(path))
 | 
			
		||||
      if(!QDir().mkpath(path))
 | 
			
		||||
        return QObject::tr("Stack trace directory %1 cannot be created. "
 | 
			
		||||
                           "Stack trace wasn't saved.").arg(path);
 | 
			
		||||
    path += QString::number(QDateTime::currentDateTimeUtc().toSecsSinceEpoch());
 | 
			
		||||
    while(QFile::exists(path))
 | 
			
		||||
      path += "_";
 | 
			
		||||
    StackTraceFile.setFileName(path);
 | 
			
		||||
    StackTraceFile.open(QIODevice::WriteOnly);
 | 
			
		||||
    if(StackTraceFile.isOpen() && StackTraceFile.isWritable())
 | 
			
		||||
    {
 | 
			
		||||
      QTextStream StackTraceWriter;
 | 
			
		||||
      StackTraceWriter.setDevice(&StackTraceFile);
 | 
			
		||||
      StackTraceWriter << QDateTime::currentDateTime().toLocalTime().toString() << "\n\n";
 | 
			
		||||
      StackTraceWriter << aStackTrace;
 | 
			
		||||
      StackTraceFile.close();
 | 
			
		||||
      return QObject::tr("Stack trace written to \"%1\".").arg(path);
 | 
			
		||||
    }
 | 
			
		||||
    return QObject::tr("Stack trace file %1 cannot be opened. "
 | 
			
		||||
                       "Stack trace wasn't saved.").arg(path);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void CrashSignalHandler(int sig)
 | 
			
		||||
  {
 | 
			
		||||
    QString msg("Program has received signal %1 during normal execution.\n\n");
 | 
			
		||||
    switch(sig)
 | 
			
		||||
    {
 | 
			
		||||
      case SIGSEGV:
 | 
			
		||||
        msg = msg.arg(QObject::tr("\"SIGSEGV\" (Segmentation fault)"));
 | 
			
		||||
        goto CRASH;
 | 
			
		||||
      case SIGFPE:
 | 
			
		||||
        msg = msg.arg(QObject::tr("\"SIGFPE\" (Arithmetic exception)"));
 | 
			
		||||
        goto CRASH;
 | 
			
		||||
      case SIGABRT:
 | 
			
		||||
        msg = msg.arg(QObject::tr("\"SIGABRT\" (Abort)"));
 | 
			
		||||
      CRASH:
 | 
			
		||||
        {
 | 
			
		||||
          void* TraceStack[StackTraceArraySize];
 | 
			
		||||
          int StackTraceSize = backtrace(TraceStack, StackTraceArraySize);
 | 
			
		||||
          auto TraceTextArray = backtrace_symbols(TraceStack, StackTraceArraySize);
 | 
			
		||||
          msg += QString(QObject::tr("Stack trace:\n"));
 | 
			
		||||
          for(int i = 0; i < StackTraceSize; i++)
 | 
			
		||||
            msg += QString::number(i) + ">  " + QString(TraceTextArray[i]) + '\n';
 | 
			
		||||
          msg += "\n\nSpark Store cannot continue.\n\n";
 | 
			
		||||
          msg += WriteStackTrace(msg);
 | 
			
		||||
          QMessageBox::critical(nullptr, QObject::tr("Spark Store Crashed"),
 | 
			
		||||
                                msg);
 | 
			
		||||
          exit(2);
 | 
			
		||||
        }
 | 
			
		||||
      default:
 | 
			
		||||
        SpkLog::Error(QObject::tr("Unknown signal %1 received in crash handler. "
 | 
			
		||||
                                  "Program internals may be corrupted. Please decide if you want "
 | 
			
		||||
                                  "to continue execution.").arg(sig), true);
 | 
			
		||||
    }
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user