File indexing completed on 2024-05-05 16:41:33
0001 /* 0002 SPDX-FileCopyrightText: 2012 Sven Brauch <svenbrauch@googlemail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "pdbframestackmodel.h" 0008 #include "debugsession.h" 0009 #include <QRegExp> 0010 0011 #include <QDebug> 0012 #include "debuggerdebug.h" 0013 0014 using namespace KDevelop; 0015 0016 namespace Python { 0017 0018 PdbFrameStackModel::PdbFrameStackModel(IDebugSession* session): FrameStackModel(session), m_debuggerAtFrame(0) 0019 { 0020 0021 } 0022 0023 int PdbFrameStackModel::debuggerAtFrame() const 0024 { 0025 return m_debuggerAtFrame; 0026 } 0027 0028 void PdbFrameStackModel::setDebuggerAtFrame(int newFrame) 0029 { 0030 // Q_ASSERT(newFrame >= 0); 0031 m_debuggerAtFrame = newFrame; 0032 } 0033 0034 void PdbFrameStackModel::framesFetched(QByteArray framelist) 0035 { 0036 qCDebug(KDEV_PYTHON_DEBUGGER) << "frames fetched:" << framelist; 0037 QList<QByteArray> lines = framelist.split('\n'); 0038 QList<FrameItem> frames; 0039 bool parsingLocation = false; 0040 FrameItem* currentFrame = nullptr; 0041 int framesCount = 0; 0042 foreach ( const QString& line, lines ) { 0043 if ( line.startsWith("-> ") ) { 0044 parsingLocation = true; 0045 if ( currentFrame ) { 0046 frames << *currentFrame; 0047 } 0048 currentFrame = new FrameItem(); 0049 currentFrame->nr = framesCount; 0050 framesCount++; 0051 } 0052 else if ( parsingLocation ) { 0053 QRegExp location("(\\>?)\\s*(.*)\\(([0-9]+)\\)(.*)"); 0054 // version 1 has some *really* weird "greedy" ruleset which makes no sense at all for me 0055 location.setPatternSyntax(QRegExp::RegExp2); 0056 if ( location.exactMatch(line) ) { 0057 qCDebug(KDEV_PYTHON_DEBUGGER) << location.capturedTexts(); 0058 if ( ! location.capturedTexts().at(1).isEmpty() ) { 0059 m_debuggerAtFrame = framesCount; 0060 } 0061 currentFrame->file = QUrl::fromLocalFile(location.capturedTexts().at(2)); 0062 currentFrame->line = location.capturedTexts().at(3).toInt() - 1; 0063 currentFrame->name = location.capturedTexts().at(4); 0064 } 0065 else { 0066 qCDebug(KDEV_PYTHON_DEBUGGER) << "regular expression mismatches" << line; 0067 } 0068 } 0069 } 0070 m_debuggerAtFrame = framesCount - m_debuggerAtFrame - 1; 0071 qCDebug(KDEV_PYTHON_DEBUGGER) << "at frame:" << m_debuggerAtFrame; 0072 QVector<FrameItem> framesReversed; 0073 framesReversed.reserve(frames.length()); 0074 for ( int i = frames.length() - 1; i >= 0; i-- ) { 0075 framesReversed.append(frames.at(i)); 0076 framesReversed.last().nr = framesCount - i - 2; 0077 } 0078 setFrames(0, framesReversed); 0079 } 0080 0081 void PdbFrameStackModel::threadsFetched(QByteArray threadsData) 0082 { 0083 qCDebug(KDEV_PYTHON_DEBUGGER) << "threads fetched" << threadsData; 0084 qCDebug(KDEV_PYTHON_DEBUGGER) << "Implement me: Thread debugging is not supported by pdb."; 0085 QVector<ThreadItem> threads; 0086 ThreadItem mainThread; 0087 mainThread.nr = 0; 0088 mainThread.name = "main thread"; 0089 threads << mainThread; 0090 setThreads(threads); 0091 setCurrentThread(0); 0092 } 0093 0094 void PdbFrameStackModel::fetchFrames(int /*threadNumber*/, int /*from*/, int /*to*/) 0095 { 0096 qCDebug(KDEV_PYTHON_DEBUGGER) << "frames requested"; 0097 InternalPdbCommand* cmd = new InternalPdbCommand(this, "framesFetched", "where\n"); 0098 static_cast<DebugSession*>(session())->addCommand(cmd); 0099 } 0100 0101 void PdbFrameStackModel::fetchThreads() 0102 { 0103 qCDebug(KDEV_PYTHON_DEBUGGER) << "threads requested"; 0104 // pdb doesn't support threads. 0105 InternalPdbCommand* cmd = new InternalPdbCommand(this, "threadsFetched", "pass\n"); 0106 static_cast<DebugSession*>(session())->addCommand(cmd); 0107 } 0108 0109 } 0110 0111 #include "moc_pdbframestackmodel.cpp"