File indexing completed on 2024-04-21 16:12:19
0001 /* 0002 SPDX-FileCopyrightText: 2010 George Kiagiadakis <kiagiadakis.george@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "backtraceparserkdbgwin.h" 0007 #include "backtraceparser_p.h" 0008 #include "drkonqi_parser_debug.h" 0009 0010 #include <QRegularExpression> 0011 0012 // BEGIN BacktraceLineKdbgwin 0013 0014 class BacktraceLineKdbgwin : public BacktraceLine 0015 { 0016 public: 0017 BacktraceLineKdbgwin(const QString &line); 0018 0019 private: 0020 void parse(); 0021 void rate(); 0022 }; 0023 0024 BacktraceLineKdbgwin::BacktraceLineKdbgwin(const QString &line) 0025 : BacktraceLine() 0026 { 0027 d->m_line = line; 0028 parse(); 0029 if (d->m_type == StackFrame) { 0030 rate(); 0031 } 0032 } 0033 0034 void BacktraceLineKdbgwin::parse() 0035 { 0036 if (d->m_line == QLatin1Char('\n')) { 0037 d->m_type = EmptyLine; 0038 return; 0039 } else if (d->m_line == QLatin1String("[KCrash Handler]\n")) { 0040 d->m_type = KCrash; 0041 return; 0042 } else if (d->m_line.startsWith(QLatin1String("Loaded"))) { 0043 d->m_type = Crap; // FIXME that's not exactly crap 0044 return; 0045 } 0046 0047 static const QRegularExpression re( 0048 QRegularExpression::anchoredPattern(QStringLiteral("([^!]+)!" // match the module name, followed by ! 0049 "([^\\(]+)\\(\\) " // match the function name, followed by () 0050 "\\[([^@]+)@ [\\-\\d]+\\] " // [filename @ line] 0051 "at 0x.*"))); // at 0xdeadbeef 0052 0053 const QRegularExpressionMatch match = re.match(d->m_line); 0054 if (match.hasMatch()) { 0055 d->m_type = StackFrame; 0056 d->m_library = match.captured(1); 0057 d->m_functionName = match.captured(2); 0058 d->m_file = match.captured(3).trimmed(); 0059 0060 qCDebug(DRKONQI_PARSER_LOG) << d->m_functionName << d->m_file << d->m_library; 0061 return; 0062 } 0063 0064 qCDebug(DRKONQI_PARSER_LOG) << "line" << d->m_line << "did not match"; 0065 } 0066 0067 void BacktraceLineKdbgwin::rate() 0068 { 0069 LineRating r; 0070 0071 // for explanations, see the LineRating enum definition 0072 if (fileName() != QLatin1String("[unknown]")) { 0073 r = Good; 0074 } else if (libraryName() != QLatin1String("[unknown]")) { 0075 if (functionName() == QLatin1String("[unknown]")) { 0076 r = MissingFunction; 0077 } else { 0078 r = MissingSourceFile; 0079 } 0080 } else { 0081 if (functionName() == QLatin1String("[unknown]")) { 0082 r = MissingEverything; 0083 } else { 0084 r = MissingLibrary; 0085 } 0086 } 0087 0088 d->m_rating = r; 0089 } 0090 0091 // END BacktraceLineKdbgwin 0092 0093 // BEGIN BacktraceParserKdbgwin 0094 0095 BacktraceParserKdbgwin::BacktraceParserKdbgwin(QObject *parent) 0096 : BacktraceParser(parent) 0097 { 0098 } 0099 0100 void BacktraceParserKdbgwin::newLine(const QString &lineStr) 0101 { 0102 Q_D(BacktraceParser); 0103 0104 BacktraceLineKdbgwin line(lineStr); 0105 switch (line.type()) { 0106 case BacktraceLine::Crap: 0107 break; // we don't want crap in the backtrace ;) 0108 case BacktraceLine::StackFrame: 0109 d->m_linesToRate.append(line); 0110 Q_FALLTHROUGH(); 0111 default: 0112 d->m_linesList.append(line); 0113 } 0114 } 0115 0116 // END BacktraceParserKdbgwin