debugger: show combined C++/QML stack

This commit is contained in:
hjk
2011-01-19 17:34:28 +01:00
parent 43599825e8
commit 49710f3986
2 changed files with 77 additions and 23 deletions

View File

@@ -391,9 +391,10 @@ RegisterHandler *DebuggerEngine::registerHandler() const
StackHandler *DebuggerEngine::stackHandler() const StackHandler *DebuggerEngine::stackHandler() const
{ {
return d->m_masterEngine //return d->m_masterEngine
? d->m_masterEngine->stackHandler() // ? d->m_masterEngine->stackHandler()
: &d->m_stackHandler; // : &d->m_stackHandler;
return &d->m_stackHandler;
} }
ThreadsHandler *DebuggerEngine::threadsHandler() const ThreadsHandler *DebuggerEngine::threadsHandler() const

View File

@@ -3,6 +3,7 @@
#include "debuggercore.h" #include "debuggercore.h"
#include "debuggerstartparameters.h" #include "debuggerstartparameters.h"
#include "stackhandler.h"
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -32,49 +33,99 @@ DebuggerEngine *createQmlCppEngine(const DebuggerStartParameters &sp)
return 0; return 0;
} }
class QmlCppEnginePrivate
////////////////////////////////////////////////////////////////////////
//
// QmlCppEnginePrivate
//
////////////////////////////////////////////////////////////////////////
class QmlCppEnginePrivate : public QObject
{ {
Q_OBJECT
public: public:
QmlCppEnginePrivate(); QmlCppEnginePrivate(QmlCppEngine *parent,
const DebuggerStartParameters &sp);
~QmlCppEnginePrivate() {} ~QmlCppEnginePrivate() {}
friend class QmlCppEngine; private slots:
void cppStackChanged();
void qmlStackChanged();
private: private:
friend class QmlCppEngine;
QmlCppEngine *q;
DebuggerEngine *m_qmlEngine; DebuggerEngine *m_qmlEngine;
DebuggerEngine *m_cppEngine; DebuggerEngine *m_cppEngine;
DebuggerEngine *m_activeEngine; DebuggerEngine *m_activeEngine;
}; };
QmlCppEnginePrivate::QmlCppEnginePrivate()
: m_qmlEngine(0), QmlCppEnginePrivate::QmlCppEnginePrivate(QmlCppEngine *parent,
const DebuggerStartParameters &sp)
: q(parent),
m_qmlEngine(0),
m_cppEngine(0), m_cppEngine(0),
m_activeEngine(0) m_activeEngine(0)
{}
QmlCppEngine::QmlCppEngine(const DebuggerStartParameters &sp)
: DebuggerEngine(sp), d(new QmlCppEnginePrivate)
{ {
d->m_qmlEngine = createQmlEngine(sp, this); m_qmlEngine = createQmlEngine(sp, q);
if (startParameters().cppEngineType == GdbEngineType) { if (sp.cppEngineType == GdbEngineType) {
d->m_cppEngine = createGdbEngine(sp, this); m_cppEngine = createGdbEngine(sp, q);
} else { } else {
QString errorMessage; QString errorMessage;
d->m_cppEngine = createCdbEngine(sp, this, &errorMessage); m_cppEngine = createCdbEngine(sp, q, &errorMessage);
if (!d->m_cppEngine) { if (!m_cppEngine) {
qWarning("%s", qPrintable(errorMessage)); qWarning("%s", qPrintable(errorMessage));
return; return;
} }
} }
d->m_activeEngine = d->m_cppEngine; m_activeEngine = m_cppEngine;
if (0) { connect(m_cppEngine->stackHandler()->model(), SIGNAL(modelReset()),
setStateDebugging(true); SLOT(cppStackChanged()), Qt::QueuedConnection);
d->m_cppEngine->setStateDebugging(true); connect(m_qmlEngine->stackHandler()->model(), SIGNAL(modelReset()),
d->m_qmlEngine->setStateDebugging(true); SLOT(qmlStackChanged()), Qt::QueuedConnection);
}
void QmlCppEnginePrivate::cppStackChanged()
{
const QLatin1String firstFunction("QScript::FunctionWrapper::proxyCall");
StackFrames frames;
foreach (const StackFrame &frame, m_cppEngine->stackHandler()->frames()) {
if (frame.function.endsWith(firstFunction))
break;
qDebug() << firstFunction << frame.function;
frames.append(frame);
} }
int level = frames.size();
foreach (StackFrame frame, m_qmlEngine->stackHandler()->frames()) {
frame.level = level++;
frames.append(frame);
}
q->stackHandler()->setFrames(frames);
}
void QmlCppEnginePrivate::qmlStackChanged()
{
q->stackHandler()->setFrames(m_qmlEngine->stackHandler()->frames());
}
////////////////////////////////////////////////////////////////////////
//
// QmlCppEngine
//
////////////////////////////////////////////////////////////////////////
QmlCppEngine::QmlCppEngine(const DebuggerStartParameters &sp)
: DebuggerEngine(sp), d(new QmlCppEnginePrivate(this, sp))
{
//setStateDebugging(true);
//m_cppEngine->setStateDebugging(true);
//m_qmlEngine->setStateDebugging(true);
} }
QmlCppEngine::~QmlCppEngine() QmlCppEngine::~QmlCppEngine()
@@ -567,3 +618,5 @@ DebuggerEngine *QmlCppEngine::cppEngine() const
} // namespace Internal } // namespace Internal
} // namespace Debugger } // namespace Debugger
#include "qmlcppengine.moc"