Commit a360c65e authored by Friedemann Kleint's avatar Friedemann Kleint
Browse files

Made CDB use colored output and add LogWarning.

parent cf2125e0
......@@ -417,10 +417,10 @@ CdbDebugEngine::CdbDebugEngine(DebuggerManager *parent, const QSharedPointer<Cdb
connect(&m_d->m_consoleStubProc, SIGNAL(processError(QString)), this, SLOT(slotConsoleStubError(QString)));
connect(&m_d->m_consoleStubProc, SIGNAL(processStarted()), this, SLOT(slotConsoleStubStarted()));
connect(&m_d->m_consoleStubProc, SIGNAL(wrapperStopped()), this, SLOT(slotConsoleStubTerminated()));
connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggerOutput(QString,QString)),
m_d->m_debuggerManager, SLOT(showDebuggerOutput(QString,QString)));
connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggerInputPrompt(QString,QString)),
m_d->m_debuggerManager, SLOT(showDebuggerInput(QString,QString)));
connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggerOutput(int,QString)),
m_d->m_debuggerManager, SLOT(showDebuggerOutput(int,QString)));
connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggerInputPrompt(int,QString)),
m_d->m_debuggerManager, SLOT(showDebuggerInput(int,QString)));
connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggeeOutput(QString)),
m_d->m_debuggerManager, SLOT(showApplicationOutput(QString)));
connect(&m_d->m_debugOutputCallBack, SIGNAL(debuggeeInputPrompt(QString)),
......@@ -755,7 +755,7 @@ void CdbDebugEnginePrivate::endDebugging(EndDebuggingMode em)
if (!errorMessage.isEmpty()) {
errorMessage = QString::fromLatin1("There were errors trying to end debugging: %1").arg(errorMessage);
m_debuggerManagerAccess->showDebuggerOutput(QLatin1String("error"), errorMessage);
m_debuggerManagerAccess->showDebuggerOutput(LogError, errorMessage);
m_engine->warning(errorMessage);
}
}
......@@ -1370,16 +1370,9 @@ void CdbDebugEngine::slotConsoleStubTerminated()
exitDebugger();
}
void CdbDebugEngine::slotAttachedCrashed()
{
m_d->m_debuggerManagerAccess->showDebuggerOutput("A","A");
m_d->handleDebugEvent();
}
void CdbDebugEngine::warning(const QString &w)
{
static const QString prefix = QLatin1String("warning:");
m_d->m_debuggerManagerAccess->showDebuggerOutput(prefix, w);
m_d->m_debuggerManagerAccess->showDebuggerOutput(LogWarning, w);
qWarning("%s\n", qPrintable(w));
}
......
......@@ -107,7 +107,6 @@ private slots:
void slotConsoleStubStarted();
void slotConsoleStubError(const QString &msg);
void slotConsoleStubTerminated();
void slotAttachedCrashed();
void warning(const QString &w);
private:
......
......@@ -372,9 +372,9 @@ STDMETHODIMP CdbDebugEventCallback::SystemError(
}
// -----------ExceptionLoggerEventCallback
CdbExceptionLoggerEventCallback::CdbExceptionLoggerEventCallback(const QString &logPrefix,
CdbExceptionLoggerEventCallback::CdbExceptionLoggerEventCallback(int logChannel,
IDebuggerManagerAccessForEngines *access) :
m_logPrefix(logPrefix),
m_logChannel(logChannel),
m_access(access)
{
}
......@@ -399,7 +399,7 @@ STDMETHODIMP CdbExceptionLoggerEventCallback::Exception(
}
if (debugCDB)
qDebug() << Q_FUNC_INFO << '\n' << m_exceptionMessages.back();
m_access->showDebuggerOutput(m_logPrefix, m_exceptionMessages.back());
m_access->showDebuggerOutput(m_logChannel, m_exceptionMessages.back());
return S_OK;
}
......
......@@ -241,7 +241,7 @@ private:
class CdbExceptionLoggerEventCallback : public CdbDebugEventCallbackBase
{
public:
explicit CdbExceptionLoggerEventCallback(const QString &logPrefix,
explicit CdbExceptionLoggerEventCallback(int logChannel,
IDebuggerManagerAccessForEngines *access);
STDMETHOD(GetInterestMask)(
......@@ -260,7 +260,7 @@ public:
QList<ULONG> exceptionCodes() const { return m_exceptionCodes; }
private:
const QString m_logPrefix;
const int m_logChannel;
IDebuggerManagerAccessForEngines *m_access;
QList<ULONG> m_exceptionCodes;
QStringList m_exceptionMessages;
......
......@@ -96,26 +96,15 @@ IDebugOutputCallbacksWide *CdbDebugOutputBase::getOutputCallback(CIDebugClient *
// ------------------------- CdbDebugOutput
// Return a prefix for debugger messages
static QString prefix(ULONG mask)
static int logChannel(ULONG mask)
{
if (mask & (DEBUG_OUTPUT_PROMPT_REGISTERS)) {
static const QString p = QLatin1String("registers:");
return p;
}
if (mask & (DEBUG_OUTPUT_EXTENSION_WARNING|DEBUG_OUTPUT_WARNING)) {
static const QString p = QLatin1String("warning:");
return p;
}
if (mask & (DEBUG_OUTPUT_ERROR)) {
static const QString p = QLatin1String("error:");
return p;
}
if (mask & DEBUG_OUTPUT_SYMBOLS) {
static const QString p = QLatin1String("symbols:");
return p;
}
static const QString commonPrefix = QLatin1String("cdb:");
return commonPrefix;
if (mask & (DEBUG_OUTPUT_PROMPT_REGISTERS))
return LogMisc;
if (mask & (DEBUG_OUTPUT_EXTENSION_WARNING|DEBUG_OUTPUT_WARNING))
return LogError;
if (mask & (DEBUG_OUTPUT_ERROR))
return LogError;
return LogMisc;
}
enum OutputKind { DebuggerOutput, DebuggerPromptOutput, DebuggeeOutput, DebuggeePromptOutput };
......@@ -144,10 +133,10 @@ void CdbDebugOutput::output(ULONG mask, const QString &_msg)
switch (outputKind(mask)) {
case DebuggerOutput:
debuggerOutput(prefix(mask), msg);
debuggerOutput(logChannel(mask), msg);
break;
case DebuggerPromptOutput:
emit debuggerInputPrompt(prefix(mask), msg);
emit debuggerInputPrompt(logChannel(mask), msg);
break;
case DebuggeeOutput:
emit debuggeeOutput(msg);
......
......@@ -82,8 +82,8 @@ protected:
virtual void output(ULONG mask, const QString &message);
signals:
void debuggerOutput(const QString &prefix, const QString &message);
void debuggerInputPrompt(const QString &prefix, const QString &message);
void debuggerOutput(int channel, const QString &message);
void debuggerInputPrompt(int channel, const QString &message);
void debuggeeOutput(const QString &message);
void debuggeeInputPrompt(const QString &message);
};
......
......@@ -148,7 +148,7 @@ static bool debuggeeLoadLibrary(IDebuggerManagerAccessForEngines *access,
if (loadDebug > 1)
qDebug() << Q_FUNC_INFO << moduleName;
// Try to ignore the breakpoints
CdbExceptionLoggerEventCallback exLogger(QLatin1String(dumperPrefixC), access);
CdbExceptionLoggerEventCallback exLogger(LogWarning, access);
EventCallbackRedirector eventRedir(cif->debugClient, &exLogger);
// Make a call to LoadLibraryA. First, reserve memory in debugger
// and copy name over.
......@@ -219,7 +219,6 @@ static QString msgLoadSucceeded(const QString &library, bool injectOrCall)
CdbDumperHelper::CdbDumperHelper(DebuggerManager *manager,
CdbComInterfaces *cif) :
m_tryInjectLoad(true),
m_messagePrefix(QLatin1String(dumperPrefixC)),
m_state(NotLoaded),
m_manager(manager),
m_access(manager),
......@@ -241,7 +240,7 @@ void CdbDumperHelper::disable()
{
if (loadDebug)
qDebug() << Q_FUNC_INFO;
m_access->showDebuggerOutput(m_messagePrefix, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Disabling dumpers due to debuggee crash..."));
m_access->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Disabling dumpers due to debuggee crash..."));
m_state = Disabled;
}
......@@ -288,7 +287,7 @@ void CdbDumperHelper::moduleLoadHook(const QString &module, HANDLE debuggeeHandl
} else {
m_state = InjectLoadFailed;
// Ok, try call loading...
m_access->showDebuggerOutput(m_messagePrefix, msgLoadFailed(m_library, true, errorMessage));
m_access->showDebuggerOutput(LogMisc, msgLoadFailed(m_library, true, errorMessage));
}
}
break;
......@@ -296,7 +295,7 @@ void CdbDumperHelper::moduleLoadHook(const QString &module, HANDLE debuggeeHandl
// check if gdbmacros.dll loaded
if (module.contains(QLatin1String(dumperModuleNameC), Qt::CaseInsensitive)) {
m_state = Loaded;
m_access->showDebuggerOutput(m_messagePrefix, msgLoadSucceeded(m_library, true));
m_access->showDebuggerOutput(LogMisc, msgLoadSucceeded(m_library, true));
}
break;
}
......@@ -343,17 +342,17 @@ bool CdbDumperHelper::ensureInitialized(QString *errorMessage)
switch (initCallLoad(errorMessage)) {
case CallLoadOk:
case CallLoadAlreadyLoaded:
m_access->showDebuggerOutput(m_messagePrefix, msgLoadSucceeded(m_library, false));
m_access->showDebuggerOutput(LogMisc, msgLoadSucceeded(m_library, false));
m_state = Loaded;
break;
case CallLoadError:
*errorMessage = msgLoadFailed(m_library, false, *errorMessage);
m_access->showDebuggerOutput(m_messagePrefix, *errorMessage);
m_access->showDebuggerOutput(LogError, *errorMessage);
m_access->showQtDumperLibraryWarning(*errorMessage);
m_state = Disabled; // No message here, no point in retrying
return false;
case CallLoadNoQtApp:
m_access->showDebuggerOutput(m_messagePrefix, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The debuggee does not appear to be Qt application."));
m_access->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The debuggee does not appear to be Qt application."));
m_state = Disabled; // No message here
return true;
}
......@@ -365,13 +364,13 @@ bool CdbDumperHelper::ensureInitialized(QString *errorMessage)
m_manager->showStatusMessage(QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Initializing dumpers..."), 10000);
const bool ok = initResolveSymbols(errorMessage) && initKnownTypes(errorMessage);
if (ok) {
m_access->showDebuggerOutput(m_messagePrefix, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Custom dumper library initialized."));
m_access->showDebuggerOutput(m_messagePrefix, m_helper.toString());
m_access->showDebuggerOutput(LogMisc, QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "Custom dumper library initialized."));
m_access->showDebuggerOutput(LogMisc, m_helper.toString());
m_state = Initialized;
} else {
m_state = Disabled; // No message here
*errorMessage = QCoreApplication::translate("Debugger::Internal::CdbDumperHelper", "The custom dumper library could not be initialized: %1").arg(*errorMessage);
m_access->showDebuggerOutput(m_messagePrefix, *errorMessage);
m_access->showDebuggerOutput(LogMisc, *errorMessage);
m_access->showQtDumperLibraryWarning(*errorMessage);
}
return ok;
......@@ -475,7 +474,7 @@ bool CdbDumperHelper::callDumper(const QString &callCmd, const QByteArray &inBuf
bool ignoreAccessViolation, QString *errorMessage)
{
*outDataPtr = 0;
CdbExceptionLoggerEventCallback exLogger(m_messagePrefix, m_access);
CdbExceptionLoggerEventCallback exLogger(LogWarning, m_access);
EventCallbackRedirector eventRedir(m_cif->debugClient, &exLogger);
// write input buffer
if (!inBuffer.isEmpty()) {
......@@ -555,7 +554,7 @@ CdbDumperHelper::DumpResult CdbDumperHelper::dumpType(const WatchData &wd, bool
// Ensure types are parsed and known.
if (!ensureInitialized(errorMessage)) {
*errorMessage = msgDumpFailed(wd, errorMessage);
m_access->showDebuggerOutput(m_messagePrefix, *errorMessage);
m_access->showDebuggerOutput(LogError, *errorMessage);
return DumpError;
}
......@@ -570,7 +569,7 @@ CdbDumperHelper::DumpResult CdbDumperHelper::dumpType(const WatchData &wd, bool
const QString message = QCoreApplication::translate("Debugger::Internal::CdbDumperHelper",
"Querying dumpers for '%1'/'%2' (%3)").
arg(wd.name, wd.exp, wd.type);
m_access->showDebuggerOutput(m_messagePrefix, message);
m_access->showDebuggerOutput(LogMisc, message);
const DumpExecuteResult der = executeDump(wd, td, dumpChildren, source, result, errorMessage);
if (der == DumpExecuteOk)
......@@ -582,7 +581,7 @@ CdbDumperHelper::DumpResult CdbDumperHelper::dumpType(const WatchData &wd, bool
m_failedTypes.push_back(wd.type);
// log error
*errorMessage = msgDumpFailed(wd, errorMessage);
m_access->showDebuggerOutput(m_messagePrefix, *errorMessage);
m_access->showDebuggerOutput(LogWarning, *errorMessage);
return DumpError;
}
......
......@@ -117,7 +117,6 @@ private:
static bool writeToDebuggee(CIDebugDataSpaces *ds, const QByteArray &buffer, quint64 address, QString *errorMessage);
const bool m_tryInjectLoad;
const QString m_messagePrefix;
State m_state;
DebuggerManager *m_manager;
IDebuggerManagerAccessForEngines *m_access;
......
......@@ -131,6 +131,7 @@ enum LogChannel
{
LogInput, // Used for user input
LogOutput,
LogWarning,
LogError,
LogStatus, // Used for status changed messages
LogDebug,
......
......@@ -60,6 +60,7 @@ static QChar charForChannel(int channel)
{
switch (channel) {
case LogDebug: return 'd';
case LogWarning: return 'w';
case LogError: return 'e';
case LogInput: return '<';
case LogOutput: return '>';
......@@ -73,6 +74,7 @@ static LogChannel channelForChar(QChar c)
{
switch (c.unicode()) {
case 'd': return LogDebug;
case 'w': return LogWarning;
case 'e': return LogError;
case '<': return LogInput;
case '>': return LogOutput;
......@@ -107,6 +109,10 @@ private:
format.setForeground(Qt::darkGreen);
setFormat(1, text.size(), format);
break;
case LogWarning:
format.setForeground(Qt::darkYellow);
setFormat(1, text.size(), format);
break;
case LogError:
format.setForeground(Qt::red);
setFormat(1, text.size(), format);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment