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