#include "cdbdumperhelper.h"
#include "cdbmodules.h"
-#include "cdbdebugengine_p.h"
+#include "cdbengine.h"
+#include "cdbengine_p.h"
#include "cdbdebugoutput.h"
#include "cdbdebugeventcallback.h"
#include "cdbsymbolgroupcontext.h"
// the QtCored4.pdb file to be present as we need "qstrdup"
// as dummy symbol. This is ok ATM since dumpers only
// make sense for Qt apps.
-static bool debuggeeLoadLibrary(DebuggerManager *manager,
+static bool debuggeeLoadLibrary(CdbEngine *cdbEngine,
CdbCore::CoreEngine *engine,
unsigned long threadId,
const QString &moduleName,
if (loadDebug > 1)
qDebug() << Q_FUNC_INFO << moduleName;
// Try to ignore the breakpoints, skip stray startup-complete trap exceptions
- QSharedPointer<CdbExceptionLoggerEventCallback> exLogger(new CdbExceptionLoggerEventCallback(LogWarning, true, manager));
+ QSharedPointer<CdbExceptionLoggerEventCallback>
+ exLogger(new CdbExceptionLoggerEventCallback(LogWarning, true, cdbEngine));
CdbCore::EventCallbackRedirector eventRedir(engine, exLogger);
Q_UNUSED(eventRedir)
// Make a call to LoadLibraryA. First, reserve memory in debugger
virtual void run();
signals:
- void logMessage(int channel, const QString &m);
+ void logMessage(const QString &m, int channel);
void statusMessage(const QString &m, int timeOut);
private:
QApplication::setOverrideCursor(Qt::BusyCursor);
CdbDumperInitThread thread(h, errorMessage);
connect(&thread, SIGNAL(statusMessage(QString,int)),
- h.m_manager, SLOT(showStatusMessage(QString,int)),
+ h.m_engine, SLOT(showStatusMessage(QString,int)),
Qt::QueuedConnection);
- connect(&thread, SIGNAL(logMessage(int,QString)),
- h.m_manager, SLOT(showDebuggerOutput(int,QString)),
+ connect(&thread, SIGNAL(logMessage(QString,int)),
+ h.m_engine, SLOT(showMessage(QString,int)),
Qt::QueuedConnection);
QEventLoop eventLoop;
connect(&thread, SIGNAL(finished()), &eventLoop, SLOT(quit()), Qt::QueuedConnection);
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
QApplication::restoreOverrideCursor();
if (thread.m_ok) {
- h.m_manager->showStatusMessage(QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Stopped / Custom dumper library initialized."), messageTimeOut);
- h.m_manager->showDebuggerOutput(LogMisc, h.m_helper.toString());
+ h.m_engine->showStatusMessage(QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Stopped / Custom dumper library initialized."), messageTimeOut);
+ h.m_engine->showMessage(h.m_helper.toString());
h.m_state = CdbDumperHelper::Initialized;
} else {
h.m_state = CdbDumperHelper::Disabled; // No message here
*errorMessage = QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The custom dumper library could not be initialized: %1").arg(*errorMessage);
- h.m_manager->showStatusMessage(*errorMessage, messageTimeOut);
- h.m_manager->showQtDumperLibraryWarning(*errorMessage);
+ h.m_engine->showStatusMessage(*errorMessage, messageTimeOut);
+ h.m_engine->showQtDumperLibraryWarning(*errorMessage);
}
if (loadDebug)
qDebug() << Q_FUNC_INFO << '\n' << thread.m_ok;
switch (m_helper.initCallLoad(m_errorMessage)) {
case CdbDumperHelper::CallLoadOk:
case CdbDumperHelper::CallLoadAlreadyLoaded:
- emit logMessage(LogMisc, msgLoadSucceeded(m_helper.m_library, false));
+ emit logMessage(msgLoadSucceeded(m_helper.m_library, false), LogMisc);
m_helper.m_state = CdbDumperHelper::Loaded;
break;
case CdbDumperHelper::CallLoadError:
m_ok = false;
return;
case CdbDumperHelper::CallLoadNoQtApp:
- emit logMessage(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The debuggee does not appear to be Qt application."));
+ emit logMessage(QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The debuggee does not appear to be Qt application."), LogMisc);
m_helper.m_state = CdbDumperHelper::Disabled; // No message here
m_ok = true;
return;
// ------------------- CdbDumperHelper
-CdbDumperHelper::CdbDumperHelper(DebuggerManager *manager,
+CdbDumperHelper::CdbDumperHelper(CdbEngine *engine,
CdbCore::CoreEngine *coreEngine) :
m_tryInjectLoad(true),
m_msgDisabled(QLatin1String("Dumpers are disabled")),
m_msgNotInScope(QLatin1String("Data not in scope")),
m_state(NotLoaded),
- m_manager(manager),
+ m_engine(engine),
m_coreEngine(coreEngine),
m_inBufferAddress(0),
m_inBufferSize(0),
{
if (loadDebug)
qDebug() << Q_FUNC_INFO;
- m_manager->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Disabling dumpers due to debuggee crash..."));
+ m_engine->showMessage(QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Disabling dumpers due to debuggee crash..."));
m_state = Disabled;
}
// for the thread to finish as this would lock up.
if (m_tryInjectLoad && module.contains(QLatin1String("Qt"), Qt::CaseInsensitive)) {
// Also shows up in the log window.
- m_manager->showStatusMessage(msgLoading(m_library, true), messageTimeOut);
+ m_engine->showMessage(msgLoading(m_library, true), StatusBar, messageTimeOut);
QString errorMessage;
SharedLibraryInjector sh(GetProcessId(debuggeeHandle));
if (sh.remoteInject(m_library, false, &errorMessage)) {
} else {
m_state = InjectLoadFailed;
// Ok, try call loading...
- m_manager->showDebuggerOutput(LogMisc, msgLoadFailed(m_library, true, errorMessage));
+ m_engine->showMessage(msgLoadFailed(m_library, true, errorMessage));
}
}
break;
// check if gdbmacros.dll loaded
if (module.contains(QLatin1String(dumperModuleNameC), Qt::CaseInsensitive)) {
m_state = Loaded;
- m_manager->showDebuggerOutput(LogMisc, msgLoadSucceeded(m_library, true));
+ m_engine->showMessage(msgLoadSucceeded(m_library, true));
}
break;
}
if (modules.filter(QLatin1String(qtCoreModuleNameC), Qt::CaseInsensitive).isEmpty())
return CallLoadNoQtApp;
// Try to load
- if (!debuggeeLoadLibrary(m_manager, m_coreEngine, m_dumperCallThread, m_library, errorMessage))
+ if (!debuggeeLoadLibrary(m_engine, m_coreEngine, m_dumperCallThread, m_library, errorMessage))
return CallLoadError;
return CallLoadOk;
}
// There is a 'qDumpInBuffer' in QtCore as well.
if (loadDebug)
qDebug() << Q_FUNC_INFO;
- bool rc;
const QString dumperModuleName = QLatin1String(dumperModuleNameC);
QString inBufferSymbol, outBufferSymbol;
+ bool rc;
if (m_fastSymbolResolution) {
// Symbols in the debugging helpers are never namespaced.
m_dumpObjectSymbol = dumperModuleName + QLatin1String("!qDumpObjectData440");
m_dumpObjectSymbol = QLatin1String("*qDumpObjectData440");
inBufferSymbol = QLatin1String("*qDumpInBuffer");
outBufferSymbol = QLatin1String("*qDumpOutBuffer");
- bool rc = resolveSymbol(m_coreEngine->interfaces().debugSymbols, &m_dumpObjectSymbol, errorMessage) == ResolveSymbolOk
+
+ rc = resolveSymbol(m_coreEngine->interfaces().debugSymbols, &m_dumpObjectSymbol, errorMessage) == ResolveSymbolOk
&& resolveSymbol(m_coreEngine->interfaces().debugSymbols, dumperModuleName, &inBufferSymbol, errorMessage) == ResolveSymbolOk
&& resolveSymbol(m_coreEngine->interfaces().debugSymbols, dumperModuleName, &outBufferSymbol, errorMessage) == ResolveSymbolOk;
if (!rc)
{
*outDataPtr = 0;
// Skip stray startup-complete trap exceptions.
- QSharedPointer<CdbExceptionLoggerEventCallback> exLogger(new CdbExceptionLoggerEventCallback(LogWarning, true, m_manager));
+ QSharedPointer<CdbExceptionLoggerEventCallback> exLogger(new
+CdbExceptionLoggerEventCallback(LogWarning, true, m_engine));
CdbCore::EventCallbackRedirector eventRedir(m_coreEngine, exLogger);
Q_UNUSED(eventRedir)
// write input buffer
// Ensure types are parsed and known.
if (!CdbDumperInitThread::ensureDumperInitialized(*this, errorMessage)) {
*errorMessage = msgDumpFailed(wd, errorMessage);
- m_manager->showDebuggerOutput(LogError, *errorMessage);
+ m_engine->showMessage(*errorMessage, LogError);
return DumpError;
}
const QString message = QCoreApplication::translate("Debugger::Internal::CdbDumperHelper",
"Querying dumpers for '%1'/'%2' (%3)").
arg(QString::fromLatin1(wd.iname), wd.exp, wd.type);
- m_manager->showDebuggerOutput(LogMisc, message);
+ m_engine->showMessage(message);
const DumpExecuteResult der = executeDump(wd, td, dumpChildren, result, errorMessage);
if (der == DumpExecuteOk)
}
// log error
*errorMessage = msgDumpFailed(wd, errorMessage);
- m_manager->showDebuggerOutput(LogWarning, *errorMessage);
+ m_engine->showMessage(*errorMessage, LogWarning);
return DumpError;
}