forked from qt-creator/qt-creator
debugger: show combined C++/QML stack
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user