diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 1a69843726d985d9e71a39abc3eccda71e1d7e9d..327bff8d213cc5b5bbb251e1a63e7553f52104db 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -340,8 +340,8 @@ void CdbEngine::syncOperateByInstruction(bool operateByInstruction) return; QTC_ASSERT(m_accessible, return); m_operateByInstruction = operateByInstruction; - runCommand(DebuggerCommand(m_operateByInstruction ? QByteArray("l-t") : QByteArray("l+t"))); - runCommand(DebuggerCommand(m_operateByInstruction ? QByteArray("l-s") : QByteArray("l+s"))); + runCommand({m_operateByInstruction ? "l-t" : "l+t", NoFlags}); + runCommand({m_operateByInstruction ? "l-s" : "l+s", NoFlags}); } void CdbEngine::syncVerboseLog(bool verboseLog) @@ -350,7 +350,7 @@ void CdbEngine::syncVerboseLog(bool verboseLog) return; QTC_ASSERT(m_accessible, return); m_verboseLog = verboseLog; - runCommand(DebuggerCommand(m_verboseLog ? QByteArray("!sym noisy") : QByteArray("!sym quiet"))); + runCommand({m_verboseLog ? "!sym noisy" : "!sym quiet", NoFlags}); } bool CdbEngine::canHandleToolTip(const DebuggerToolTipContext &context) const @@ -474,11 +474,9 @@ void CdbEngine::consoleStubExited() void CdbEngine::createFullBacktrace() { - DebuggerCommand cmd("~*kp"); - cmd.callback = [this](const DebuggerResponse &response) { + runCommand({"~*kp", BuiltinCommand, [this](const DebuggerResponse &response) { Internal::openTextEditor(QLatin1String("Backtrace $"), response.data.toLatin1()); - }; - runCommand(cmd, BuiltinCommand); + }}); } void CdbEngine::setupEngine() @@ -646,7 +644,7 @@ bool CdbEngine::launchCDB(const DebuggerRunParameters &sp, QString *errorMessage m_hasDebuggee = true; if (isRemote) { // We do not get an 'idle' in a remote session, but are accessible m_accessible = true; - runCommand(DebuggerCommand(".load " + extensionFileName.toLocal8Bit())); + runCommand({".load " + extensionFileName.toLocal8Bit(), NoFlags}); STATE_DEBUG(state(), Q_FUNC_INFO, __LINE__, "notifyEngineSetupOk") notifyEngineSetupOk(); } @@ -659,27 +657,25 @@ void CdbEngine::setupInferior() qDebug("setupInferior"); const DebuggerRunParameters &rp = runParameters(); if (!rp.commandsAfterConnect.isEmpty()) - runCommand(DebuggerCommand(rp.commandsAfterConnect)); + runCommand({rp.commandsAfterConnect, NoFlags}); // QmlCppEngine expects the QML engine to be connected before any breakpoints are hit // (attemptBreakpointSynchronization() will be directly called then) attemptBreakpointSynchronization(); if (rp.breakOnMain) { const BreakpointParameters bp(BreakpointAtMain); BreakpointModelId id(quint16(-1)); - DebuggerCommand cmd(cdbAddBreakpointCommand(bp, m_sourcePathMappings, id, true)); - cmd.callback = [this, id](const DebuggerResponse &r) { handleBreakInsert(r, id); }; - runCommand(cmd, BuiltinCommand); - } - runCommand(DebuggerCommand("sxn 0x4000001f")); // Do not break on WowX86 exceptions. - runCommand(DebuggerCommand("sxn ibp")); // Do not break on initial breakpoints. - runCommand(DebuggerCommand(".asm source_line")); // Source line in assembly - runCommand(DebuggerCommand(m_extensionCommandPrefixBA + "setparameter maxStringLength=" + runCommand({cdbAddBreakpointCommand(bp, m_sourcePathMappings, id, true), BuiltinCommand, + [this, id](const DebuggerResponse &r) { handleBreakInsert(r, id); }}); + } + runCommand({"sxn 0x4000001f", NoFlags}); // Do not break on WowX86 exceptions. + runCommand({"sxn ibp", NoFlags}); // Do not break on initial breakpoints. + runCommand({".asm source_line", NoFlags}); // Source line in assembly + runCommand({m_extensionCommandPrefixBA + "setparameter maxStringLength=" + action(MaximalStringLength)->value().toByteArray() + " maxStackDepth=" - + action(MaximalStackDepth)->value().toByteArray())); + + action(MaximalStackDepth)->value().toByteArray(), NoFlags}); - DebuggerCommand cmd("pid"); - cmd.callback = [this](const DebuggerResponse &response) { + runCommand({"pid", ExtensionCommand, [this](const DebuggerResponse &response) { // Fails for core dumps. if (response.resultClass == ResultDone) notifyInferiorPid(response.data.data().toULongLong()); @@ -692,8 +688,7 @@ void CdbEngine::setupInferior() STATE_DEBUG(state(), Q_FUNC_INFO, __LINE__, "notifyInferiorSetupFailed") notifyInferiorSetupFailed(); } - }; - runCommand(cmd, ExtensionCommand); + }}); } static QByteArray msvcRunTime(const Abi::OSFlavor flavour) @@ -736,35 +731,25 @@ void CdbEngine::runEngine() const QStringList breakEvents = stringListSetting(CdbBreakEvents); foreach (const QString &breakEvent, breakEvents) - runCommand(DebuggerCommand(QByteArray("sxe ") + breakEvent.toLatin1())); + runCommand({"sxe " + breakEvent.toLatin1(), NoFlags}); // Break functions: each function must be fully qualified, // else the debugger will slow down considerably. - DebuggerCommand cmd; - cmd.callback = [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }; + const auto cb = [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }; if (boolSetting(CdbBreakOnCrtDbgReport)) { const QByteArray module = msvcRunTime(runParameters().toolChainAbi.osFlavor()); const QByteArray debugModule = module + 'D'; const QByteArray wideFunc = QByteArray(CdbOptionsPage::crtDbgReport).append('W'); - cmd.function = breakAtFunctionCommand(CdbOptionsPage::crtDbgReport, module); - runCommand(cmd, BuiltinCommand); - cmd.function = breakAtFunctionCommand(wideFunc, module); - runCommand(cmd, BuiltinCommand); - cmd.function = breakAtFunctionCommand(CdbOptionsPage::crtDbgReport, debugModule); - runCommand(cmd, BuiltinCommand); - cmd.function = breakAtFunctionCommand(wideFunc, debugModule); - runCommand(cmd, BuiltinCommand); + runCommand({breakAtFunctionCommand(CdbOptionsPage::crtDbgReport, module), BuiltinCommand, cb}); + runCommand({breakAtFunctionCommand(wideFunc, module), BuiltinCommand, cb}); + runCommand({breakAtFunctionCommand(CdbOptionsPage::crtDbgReport, debugModule), BuiltinCommand, cb}); } if (boolSetting(BreakOnWarning)) { - cmd.function = "bm /( QtCored4!qWarning"; // 'bm': All overloads. - runCommand(cmd, BuiltinCommand); - cmd.function = "bm /( Qt5Cored!QMessageLogger::warning"; - runCommand(cmd, BuiltinCommand); + runCommand({"bm /( QtCored4!qWarning", BuiltinCommand}); // 'bm': All overloads. + runCommand({"bm /( Qt5Cored!QMessageLogger::warning", BuiltinCommand}); } if (boolSetting(BreakOnFatal)) { - cmd.function = "bm /( QtCored4!qFatal"; // 'bm': All overloads. - runCommand(cmd, BuiltinCommand); - cmd.function = "bm /( Qt5Cored!QMessageLogger::fatal"; - runCommand(cmd, BuiltinCommand); + runCommand({"bm /( QtCored4!qFatal", BuiltinCommand}); // 'bm': All overloads. + runCommand({"bm /( Qt5Cored!QMessageLogger::fatal", BuiltinCommand}); } if (runParameters().startMode == AttachCore) { QTC_ASSERT(!m_coreStopReason.isNull(), return; ); @@ -848,10 +833,10 @@ void CdbEngine::shutdownEngine() detachDebugger(); // Remote requires a bit more force to quit. if (m_effectiveStartMode == AttachToRemoteServer) { - runCommand(DebuggerCommand(m_extensionCommandPrefixBA + "shutdownex")); - runCommand(DebuggerCommand("qq")); + runCommand({m_extensionCommandPrefixBA + "shutdownex", NoFlags}); + runCommand({"qq", NoFlags}); } else { - runCommand(DebuggerCommand("q")); + runCommand({"q", NoFlags}); } } else { // Remote process. No can do, currently @@ -885,7 +870,7 @@ void CdbEngine::processFinished() void CdbEngine::detachDebugger() { - runCommand(DebuggerCommand(".detach")); + runCommand({".detach", NoFlags}); } static inline bool isWatchIName(const QByteArray &iname) @@ -913,21 +898,21 @@ void CdbEngine::executeStep() { if (!m_operateByInstruction) m_sourceStepInto = true; // See explanation at handleStackTrace(). - runCommand(DebuggerCommand(QByteArray("t"))); // Step into-> t (trace) + runCommand({"t", NoFlags}); // Step into-> t (trace) STATE_DEBUG(state(), Q_FUNC_INFO, __LINE__, "notifyInferiorRunRequested") notifyInferiorRunRequested(); } void CdbEngine::executeStepOut() { - runCommand(DebuggerCommand(QByteArray("gu"))); // Step out-> gu (go up) + runCommand({"gu", NoFlags}); // Step out-> gu (go up) STATE_DEBUG(state(), Q_FUNC_INFO, __LINE__, "notifyInferiorRunRequested") notifyInferiorRunRequested(); } void CdbEngine::executeNext() { - runCommand(DebuggerCommand(QByteArray("p"))); // Step over -> p + runCommand({"p", NoFlags}); // Step over -> p STATE_DEBUG(state(), Q_FUNC_INFO, __LINE__, "notifyInferiorRunRequested") notifyInferiorRunRequested(); } @@ -951,7 +936,7 @@ void CdbEngine::continueInferior() void CdbEngine::doContinueInferior() { - runCommand(DebuggerCommand(QByteArray("g"))); + runCommand({"g", NoFlags}); } bool CdbEngine::canInterruptInferior() const @@ -1025,9 +1010,8 @@ void CdbEngine::executeRunToLine(const ContextData &data) bp.lineNumber = data.lineNumber; } - DebuggerCommand cmd(cdbAddBreakpointCommand(bp, m_sourcePathMappings, BreakpointModelId(), true)); - cmd.callback = [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }; - runCommand(cmd, BuiltinCommand); + runCommand({cdbAddBreakpointCommand(bp, m_sourcePathMappings, BreakpointModelId(), true), BuiltinCommand, + [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }}); continueInferior(); } @@ -1036,10 +1020,8 @@ void CdbEngine::executeRunToFunction(const QString &functionName) // Add one-shot breakpoint BreakpointParameters bp(BreakpointByFunction); bp.functionName = functionName; - - DebuggerCommand cmd(cdbAddBreakpointCommand(bp, m_sourcePathMappings, BreakpointModelId(), true)); - cmd.callback = [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }; - runCommand(cmd, BuiltinCommand); + runCommand({cdbAddBreakpointCommand(bp, m_sourcePathMappings, BreakpointModelId(), true), BuiltinCommand, + [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }}); continueInferior(); } @@ -1049,7 +1031,7 @@ void CdbEngine::setRegisterValue(const QByteArray &name, const QString &value) QByteArray cmd; ByteArrayInputStream str(cmd); str << "r " << name << '=' << value; - runCommand(DebuggerCommand(cmd)); + runCommand({cmd, NoFlags}); reloadRegisters(); } @@ -1061,25 +1043,25 @@ void CdbEngine::executeJumpToLine(const ContextData &data) gotoLocation(Location(data.address)); } else { // Jump to source line: Resolve source line address and go to that location - DebuggerCommand cmd; - ByteArrayInputStream str(cmd.function); + QByteArray cmd; + ByteArrayInputStream str(cmd); str << "? `" << QDir::toNativeSeparators(data.fileName) << ':' << data.lineNumber << '`'; - cmd.callback = [this, data](const DebuggerResponse &r) { handleJumpToLineAddressResolution(r, data); }; - runCommand(cmd, BuiltinCommand); + runCommand({cmd, BuiltinCommand, [this, data](const DebuggerResponse &r) { + handleJumpToLineAddressResolution(r, data); }}); } } void CdbEngine::jumpToAddress(quint64 address) { // Fake a jump to address by setting the PC register. - QByteArray registerCmd; - ByteArrayInputStream str(registerCmd); + QByteArray cmd; + ByteArrayInputStream str(cmd); // PC-register depending on 64/32bit. str << "r " << (runParameters().toolChainAbi.wordWidth() == 64 ? "rip" : "eip") << '='; str.setHexPrefix(true); str.setIntegerBase(16); str << address; - runCommand(DebuggerCommand(registerCmd)); + runCommand({cmd, NoFlags}); } void CdbEngine::handleJumpToLineAddressResolution(const DebuggerResponse &response, const ContextData &context) @@ -1144,7 +1126,7 @@ void CdbEngine::assignValueInDebugger(WatchItem *w, const QString &expr, const Q break; } - runCommand(DebuggerCommand(cmd)); + runCommand({cmd, NoFlags}); // Update all locals in case we change a union or something pointed to // that affects other variables, too. updateLocals(); @@ -1168,11 +1150,11 @@ void CdbEngine::handleThreads(const DebuggerResponse &response) void CdbEngine::executeDebuggerCommand(const QString &command, DebuggerLanguages languages) { if (languages & CppLanguage) - runCommand(DebuggerCommand(command.toLocal8Bit())); + runCommand({command.toLocal8Bit(), NoFlags}); } // Post command to the cdb process -void CdbEngine::runCommand(const DebuggerCommand &dbgCmd, int flags) +void CdbEngine::runCommand(const DebuggerCommand &dbgCmd) { QByteArray cmd = dbgCmd.function + dbgCmd.argsToString(); if (!m_accessible) { @@ -1184,7 +1166,7 @@ void CdbEngine::runCommand(const DebuggerCommand &dbgCmd, int flags) QByteArray fullCmd; ByteArrayInputStream str(fullCmd); - if (flags & BuiltinCommand) { + if (dbgCmd.flags & BuiltinCommand) { // Post a built-in-command producing free-format output with a callback. // In order to catch the output, it is enclosed in 'echo' commands // printing a specially formatted token to be identifiable in the output. @@ -1192,7 +1174,7 @@ void CdbEngine::runCommand(const DebuggerCommand &dbgCmd, int flags) str << ".echo \"" << m_tokenPrefix << token << "<\"\n" << cmd << "\n.echo \"" << m_tokenPrefix << token << ">\""; m_commandForToken.insert(token, dbgCmd); - } else if (flags & ExtensionCommand) { + } else if (dbgCmd.flags & ExtensionCommand) { // Post an extension command producing one-line output with a callback, // pass along token for identification in hash. const int token = m_nextCommandToken++; @@ -1331,10 +1313,10 @@ void CdbEngine::doUpdateLocals(const UpdateParameters &updateParameters) if (partialUpdate) str << blankSeparator << updateParameters.partialVariable; - DebuggerCommand cmd("locals"); + DebuggerCommand cmd("locals", ExtensionCommand); cmd.args = QLatin1String(arguments); cmd.callback = [this, partialUpdate](const DebuggerResponse &r) { handleLocals(r, partialUpdate); }; - runCommand(cmd, ExtensionCommand); + runCommand(cmd); } void CdbEngine::updateAll() @@ -1349,9 +1331,8 @@ void CdbEngine::selectThread(ThreadId threadId) threadsHandler()->setCurrentThread(threadId); - DebuggerCommand cmd('~' + QByteArray::number(threadId.raw()) + " s"); - cmd.callback = [this](const DebuggerResponse &) { reloadFullStack(); }; - runCommand(cmd, BuiltinCommand); + runCommand({'~' + QByteArray::number(threadId.raw()) + " s", BuiltinCommand, + [this](const DebuggerResponse &) { reloadFullStack(); }}); } // Default address range for showing disassembly. @@ -1401,7 +1382,8 @@ void CdbEngine::postDisassemblerCommand(quint64 address, quint64 endAddress, // Parse: "00000000`77606060 cc int 3" agent->setContents(parseCdbDisassembler(response.data.data())); }; - runCommand(cmd, BuiltinCommand); + cmd.flags = BuiltinCommand; + runCommand(cmd); } void CdbEngine::postResolveSymbol(const QString &module, const QString &function, @@ -1413,14 +1395,10 @@ void CdbEngine::postResolveSymbol(const QString &module, const QString &function const QList<quint64> addresses = m_symbolAddressCache.values(symbol); if (addresses.isEmpty()) { showMessage(QLatin1String("Resolving symbol: ") + symbol + QLatin1String("..."), LogMisc); - DebuggerCommand cmd(QByteArray("x ") + symbol.toLatin1()); - cmd.callback = [this, symbol, agent](const DebuggerResponse &r) { - handleResolveSymbol(r, symbol, agent); - }; - runCommand(cmd, BuiltinCommand); + runCommand({"x " + symbol.toLatin1(), BuiltinCommand, + [this, symbol, agent](const DebuggerResponse &r) { handleResolveSymbol(r, symbol, agent); }}); } else { - showMessage(QString::fromLatin1("Using cached addresses for %1."). - arg(symbol), LogMisc); + showMessage(QString::fromLatin1("Using cached addresses for %1.").arg(symbol), LogMisc); handleResolveSymbolHelper(addresses, agent); } } @@ -1556,7 +1534,7 @@ void CdbEngine::fetchMemory(MemoryAgent *agent, QObject *editor, quint64 addr, q void CdbEngine::postFetchMemory(const MemoryViewCookie &cookie) { - DebuggerCommand cmd("memory"); + DebuggerCommand cmd("memory", ExtensionCommand); QByteArray args; ByteArrayInputStream str(args); str << cookie.address << ' ' << cookie.length; @@ -1570,7 +1548,7 @@ void CdbEngine::postFetchMemory(const MemoryViewCookie &cookie) showMessage(response.data["msg"].toLatin1(), LogWarning); } }; - runCommand(cmd, ExtensionCommand); + runCommand(cmd); } void CdbEngine::changeMemory(Internal::MemoryAgent *, QObject *, quint64 addr, const QByteArray &data) @@ -1580,15 +1558,13 @@ void CdbEngine::changeMemory(Internal::MemoryAgent *, QObject *, quint64 addr, c const MemoryChangeCookie cookie(addr, data); doInterruptInferiorCustomSpecialStop(qVariantFromValue(cookie)); } else { - runCommand(DebuggerCommand(cdbWriteMemoryCommand(addr, data))); + runCommand({cdbWriteMemoryCommand(addr, data), NoFlags}); } } void CdbEngine::reloadModules() { - DebuggerCommand cmd("modules"); - cmd.callback = CB(handleModules); - runCommand(cmd, ExtensionCommand); + runCommand({"modules", ExtensionCommand, CB(handleModules)}); } void CdbEngine::loadSymbols(const QString & /* moduleName */) @@ -1607,9 +1583,7 @@ void CdbEngine::requestModuleSymbols(const QString &moduleName) void CdbEngine::reloadRegisters() { QTC_ASSERT(threadsHandler()->currentThreadIndex() >= 0, return); - DebuggerCommand cmd("registers"); - cmd.callback = CB(handleRegistersExt); - runCommand(cmd, ExtensionCommand); + runCommand({"registers", ExtensionCommand, CB(handleRegistersExt)}); } void CdbEngine::reloadSourceFiles() @@ -1620,18 +1594,18 @@ void CdbEngine::reloadFullStack() { if (debug) qDebug("%s", Q_FUNC_INFO); - DebuggerCommand cmd("stack"); + DebuggerCommand cmd("stack", ExtensionCommand); cmd.args = QStringLiteral("unlimited"); cmd.callback = CB(handleStackTrace); - runCommand(cmd, ExtensionCommand); + runCommand(cmd); } void CdbEngine::listBreakpoints() { - DebuggerCommand cmd("breakpoints"); + DebuggerCommand cmd("breakpoints", ExtensionCommand); cmd.args = QStringLiteral("-v"); cmd.callback = CB(handleBreakPoints); - runCommand(cmd, ExtensionCommand); + runCommand(cmd); } void CdbEngine::handleModules(const DebuggerResponse &response) @@ -1845,8 +1819,7 @@ unsigned CdbEngine::examineStopReason(const GdbMi &stopReason, if (!conditionalBreakPointTriggered && !parameters.condition.isEmpty()) { *message = msgCheckingConditionalBreakPoint(id, number, parameters.condition, QString::number(threadId)); - - DebuggerCommand cmd("expression"); + DebuggerCommand cmd("expression", ExtensionCommand); QByteArray args = parameters.condition; if (args.contains(' ') && !args.startsWith('"')) { args.prepend('"'); @@ -1856,7 +1829,7 @@ unsigned CdbEngine::examineStopReason(const GdbMi &stopReason, cmd.callback = [this, id, stopReason](const DebuggerResponse &response) { handleExpression(response, id, stopReason); }; - runCommand(cmd, ExtensionCommand); + runCommand(cmd); return StopReportLog; } @@ -2004,7 +1977,7 @@ void CdbEngine::processStop(const GdbMi &stopReason, bool conditionalBreakPointT // Start sequence to get all relevant data. if (stopFlags & StopInArtificialThread) { showMessage(tr("Switching to main thread..."), LogMisc); - runCommand(DebuggerCommand("~0 s")); + runCommand({"~0 s", NoFlags}); forcedThreadId = ThreadId(0); // Re-fetch stack again. reloadFullStack(); @@ -2019,9 +1992,8 @@ void CdbEngine::processStop(const GdbMi &stopReason, bool conditionalBreakPointT executeStepOut(); return; case ParseStackWow64: - DebuggerCommand cmd("lm m wow64"); - cmd.callback = [this, stack](const DebuggerResponse &r) { handleCheckWow64(r, stack); }; - runCommand(cmd, BuiltinCommand); + runCommand({"lm m wow64", BuiltinCommand, + [this, stack](const DebuggerResponse &r) { handleCheckWow64(r, stack); }}); break; } } else { @@ -2112,9 +2084,8 @@ void CdbEngine::handleCheckWow64(const DebuggerResponse &response, const GdbMi & // start end module name // 00000000`77490000 00000000`774d5000 wow64 (deferred) if (response.data.data().contains("wow64")) { - DebuggerCommand cmd("k"); - cmd.callback = [this, stack](const DebuggerResponse &r) { ensureUsing32BitStackInWow64(r, stack); }; - runCommand(cmd, BuiltinCommand); + runCommand({"k", BuiltinCommand, + [this, stack](const DebuggerResponse &r) { ensureUsing32BitStackInWow64(r, stack); }}); return; } m_wow64State = noWow64Stack; @@ -2134,9 +2105,7 @@ void CdbEngine::ensureUsing32BitStackInWow64(const DebuggerResponse &response, c return; } else if (line.startsWith("Child-SP")) { m_wow64State = wow64Stack64Bit; - DebuggerCommand cmd("!wow64exts.sw"); - cmd.callback = CB(handleSwitchWow64Stack); - runCommand(cmd, BuiltinCommand); + runCommand({"!wow64exts.sw", BuiltinCommand, CB(handleSwitchWow64Stack)}); return; } } @@ -2153,9 +2122,7 @@ void CdbEngine::handleSwitchWow64Stack(const DebuggerResponse &response) else m_wow64State = noWow64Stack; // reload threads and the stack after switching the mode - DebuggerCommand cmd("threads"); - cmd.callback = CB(handleThreads); - runCommand(cmd, ExtensionCommand); + runCommand({"threads", ExtensionCommand, CB(handleThreads)}); } void CdbEngine::handleSessionAccessible(unsigned long cdbExState) @@ -2670,6 +2637,7 @@ void CdbEngine::attemptBreakpointSynchronization() foreach (Breakpoint bp, bps) { BreakpointParameters parameters = bp.parameters(); BreakpointModelId id = bp.id(); + const auto handleBreakInsertCB = [this, id](const DebuggerResponse &r) { handleBreakInsert(r, id); }; BreakpointResponse response; response.fromParameters(parameters); response.id = BreakpointResponseId(id.majorPart(), id.minorPart()); @@ -2688,16 +2656,14 @@ void CdbEngine::attemptBreakpointSynchronization() lineCorrection.reset(new BreakpointCorrectionContext(Internal::cppCodeModelSnapshot(), CppTools::CppModelManager::instance()->workingCopy())); response.lineNumber = lineCorrection->fixLineNumber(parameters.fileName, parameters.lineNumber); - DebuggerCommand cmd(cdbAddBreakpointCommand(response, m_sourcePathMappings, id, false)); - cmd.callback = [this, id](const DebuggerResponse &r) { handleBreakInsert(r, id); }; - runCommand(cmd, BuiltinCommand); + QByteArray cmd = cdbAddBreakpointCommand(response, m_sourcePathMappings, id, false); + runCommand({cmd, BuiltinCommand, handleBreakInsertCB}); } else { - DebuggerCommand cmd(cdbAddBreakpointCommand(parameters, m_sourcePathMappings, id, false)); - cmd.callback = [this, id](const DebuggerResponse &r) { handleBreakInsert(r, id); }; - runCommand(cmd, BuiltinCommand); + QByteArray cmd = cdbAddBreakpointCommand(parameters, m_sourcePathMappings, id, false); + runCommand({cmd, BuiltinCommand, handleBreakInsertCB}); } if (!parameters.enabled) - runCommand(DebuggerCommand("bd " + QByteArray::number(breakPointIdToCdbId(id)))); + runCommand({"bd " + QByteArray::number(breakPointIdToCdbId(id)), NoFlags}); bp.notifyBreakpointInsertProceeding(); bp.notifyBreakpointInsertOk(); m_pendingBreakpointMap.insert(id, response); @@ -2716,24 +2682,23 @@ void CdbEngine::attemptBreakpointSynchronization() qPrintable(parameters.toString())); if (parameters.enabled != bp.response().enabled) { // Change enabled/disabled breakpoints without triggering update. - runCommand(DebuggerCommand((parameters.enabled ? "be " : "bd ") - + QByteArray::number(breakPointIdToCdbId(id)))); + runCommand({(parameters.enabled ? "be " : "bd ") + + QByteArray::number(breakPointIdToCdbId(id)), NoFlags}); response.pending = false; response.enabled = parameters.enabled; bp.setResponse(response); } else { // Delete and re-add, triggering update addedChanged = true; - runCommand(DebuggerCommand(cdbClearBreakpointCommand(id))); - DebuggerCommand cmd(cdbAddBreakpointCommand(parameters, m_sourcePathMappings, id, false)); - cmd.callback = [this, id](const DebuggerResponse &r) { handleBreakInsert(r, id); }; - runCommand(cmd, BuiltinCommand); + runCommand({cdbClearBreakpointCommand(id), NoFlags}); + QByteArray cmd(cdbAddBreakpointCommand(parameters, m_sourcePathMappings, id, false)); + runCommand({cmd, BuiltinCommand, handleBreakInsertCB}); m_pendingBreakpointMap.insert(id, response); } bp.notifyBreakpointChangeOk(); break; case BreakpointRemoveRequested: - runCommand(DebuggerCommand(cdbClearBreakpointCommand(id))); + runCommand({cdbClearBreakpointCommand(id), NoFlags}); bp.notifyBreakpointRemoveProceeding(); bp.notifyBreakpointRemoveOk(); m_pendingBreakpointMap.remove(id); @@ -2745,7 +2710,7 @@ void CdbEngine::attemptBreakpointSynchronization() foreach (BreakpointModelId id, m_insertSubBreakpointMap.keys()) { addedChanged = true; const BreakpointResponse &response = m_insertSubBreakpointMap.value(id); - runCommand(DebuggerCommand(cdbAddBreakpointCommand(response, m_sourcePathMappings, id, false))); + runCommand({cdbAddBreakpointCommand(response, m_sourcePathMappings, id, false), NoFlags}); m_insertSubBreakpointMap.remove(id); m_pendingSubBreakpointMap.insert(id, response); } @@ -2873,9 +2838,7 @@ unsigned CdbEngine::parseStackTrace(const GdbMi &data, bool sourceStepInto) void CdbEngine::loadAdditionalQmlStack() { - DebuggerCommand cmd("qmlstack"); - cmd.callback = CB(handleAdditionalQmlStack); - runCommand(cmd, ExtensionCommand); + runCommand({"qmlstack", ExtensionCommand, CB(handleAdditionalQmlStack)}); } void CdbEngine::handleAdditionalQmlStack(const DebuggerResponse &response) @@ -2920,9 +2883,8 @@ void CdbEngine::handleStackTrace(const DebuggerResponse &response) GdbMi stack = response.data; if (response.resultClass == ResultDone) { if (parseStackTrace(stack, false) == ParseStackWow64) { - DebuggerCommand cmd("lm m wow64"); - cmd.callback = [this, stack](const DebuggerResponse &r) { handleCheckWow64(r, stack); }; - runCommand(cmd, BuiltinCommand); + runCommand({"lm m wow64", BuiltinCommand, + [this, stack](const DebuggerResponse &r) { handleCheckWow64(r, stack); }}); } } else { showMessage(stack["msg"].toLatin1(), LogError); @@ -3096,17 +3058,16 @@ void CdbEngine::watchPoint(const QPoint &p) void CdbEngine::postWidgetAtCommand() { - DebuggerCommand cmd("widgetat"); + DebuggerCommand cmd("widgetat", ExtensionCommand); cmd.args = QString::fromLatin1("%1 %2").arg(m_watchPointX, m_watchPointY); - cmd.callback = CB(handleWidgetAt); - runCommand(cmd, ExtensionCommand); + runCommand(cmd); } void CdbEngine::handleCustomSpecialStop(const QVariant &v) { if (v.canConvert<MemoryChangeCookie>()) { const MemoryChangeCookie changeData = qvariant_cast<MemoryChangeCookie>(v); - runCommand(DebuggerCommand(cdbWriteMemoryCommand(changeData.address, changeData.data))); + runCommand({cdbWriteMemoryCommand(changeData.address, changeData.data), NoFlags}); return; } if (v.canConvert<MemoryViewCookie>()) { diff --git a/src/plugins/debugger/cdb/cdbengine.h b/src/plugins/debugger/cdb/cdbengine.h index 9623e4eb78190c17ded8f013d5d0cc8fd6509153..8e677957617a1caef1fa21b650f48f5afcf8bc64 100644 --- a/src/plugins/debugger/cdb/cdbengine.h +++ b/src/plugins/debugger/cdb/cdbengine.h @@ -127,7 +127,7 @@ private slots: void readyReadStandardError(); void processError(); void processFinished(); - void runCommand(const DebuggerCommand &cmd, int flags = 0); + void runCommand(const DebuggerCommand &cmd) override; void operateByInstructionTriggered(bool); void verboseLogTriggered(bool); @@ -164,7 +164,7 @@ private: ParseStackWow64 = 3 // Hit on a frame with 32bit emulation, switch debugger to 32 bit mode }; enum CommandFlags { - NoCallBack = 0, + NoFlags = 0, BuiltinCommand, ExtensionCommand, }; diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 2d5f14c0ebb58d0022117297f069fa8b00279e2b..2084bf64a5794c37bc06f2abe18faad8f77afeff 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1479,6 +1479,12 @@ void DebuggerEngine::watchPoint(const QPoint &) { } +void DebuggerEngine::runCommand(const DebuggerCommand &) +{ + // Overridden in the engines that use the interface. + QTC_CHECK(false); +} + void DebuggerEngine::fetchDisassembler(DisassemblerAgent *) { } diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index b4edd5eeaa116559ad3f9bdfa327c2da59f08c76..4b840640ce5b1360559a1bf668f4bdd3d96c0b5a 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -33,6 +33,7 @@ #include "debugger_global.h" #include "debuggerconstants.h" +#include "debuggerprotocol.h" #include "debuggerstartparameters.h" #include <projectexplorer/devicesupport/idevice.h> @@ -61,7 +62,6 @@ namespace Internal { class DebuggerEnginePrivate; class DebuggerPluginPrivate; class DisassemblerAgent; -class GdbMi; class MemoryAgent; class WatchData; class WatchItem; @@ -217,6 +217,7 @@ public: MemoryView = 0x4 //!< Open a separate view (using the pos-parameter). }; + virtual void runCommand(const DebuggerCommand &cmd); virtual void openMemoryView(const MemoryViewSetupData &data); virtual void fetchMemory(Internal::MemoryAgent *, QObject *, quint64 addr, quint64 length); diff --git a/src/plugins/debugger/debuggerprotocol.h b/src/plugins/debugger/debuggerprotocol.h index 6c9dbebeb4e7c092d0ada87b4be0fb7f62f4ce16..f85746a006a945e9b41f136caa2c53525c195048 100644 --- a/src/plugins/debugger/debuggerprotocol.h +++ b/src/plugins/debugger/debuggerprotocol.h @@ -52,9 +52,10 @@ public: typedef std::function<void(const DebuggerResponse &)> Callback; DebuggerCommand() {} - DebuggerCommand(const char *f, int fl = 0) : function(f), flags(fl) {} - DebuggerCommand(const QByteArray &f, int fl = 0) : function(f), flags(fl) {} - DebuggerCommand(const char *f, const QJsonValue &a, int fl = 0) : function(f), args(a), flags(fl) {} + DebuggerCommand(const QByteArray &f) : function(f), flags(0) {} + DebuggerCommand(const QByteArray &f, const QJsonValue &a) : function(f), args(a), flags(0) {} + DebuggerCommand(const QByteArray &f, int fl) : function(f), flags(fl) {} + DebuggerCommand(const QByteArray &f, int fl, const Callback &cb) : function(f), callback(cb), flags(fl) {} void arg(const char *value); void arg(const char *name, int value); diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp index bdd71bc4bd9ba676748f313f4ddc08d879f0b38b..56ac21f3bc369fce09cff18ca8a5bd63ecfe4af8 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.cpp +++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp @@ -75,9 +75,8 @@ void GdbAttachEngine::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); const qint64 pid = runParameters().attachPID; - DebuggerCommand cmd("attach " + QByteArray::number(pid)); - cmd.callback = [this](const DebuggerResponse &r) { handleAttach(r); }; - runCommand(cmd); + runCommand({"attach " + QByteArray::number(pid), NoFlags, + [this](const DebuggerResponse &r) { handleAttach(r); }}); showStatusMessage(tr("Attached to process %1.").arg(inferiorPid())); } diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp index d07cf0272711307bd52d8a40eb55e8357bc74771..8987b9e879ff9f80ba0c87cab42a23cc3ca27d9a 100644 --- a/src/plugins/debugger/gdb/coregdbadapter.cpp +++ b/src/plugins/debugger/gdb/coregdbadapter.cpp @@ -212,9 +212,8 @@ void GdbCoreEngine::setupInferior() // Do that first, otherwise no symbols are loaded. QFileInfo fi(m_executable); QByteArray path = fi.absoluteFilePath().toLocal8Bit(); - DebuggerCommand cmd("-file-exec-and-symbols \"" + path + '"'); - cmd.callback = CB(handleFileExecAndSymbols); - runCommand(cmd); + runCommand({"-file-exec-and-symbols \"" + path + '"', NoFlags, + CB(handleFileExecAndSymbols)}); } void GdbCoreEngine::handleFileExecAndSymbols(const DebuggerResponse &response) @@ -237,9 +236,8 @@ void GdbCoreEngine::handleFileExecAndSymbols(const DebuggerResponse &response) void GdbCoreEngine::runEngine() { CHECK_STATE(EngineRunRequested); - DebuggerCommand cmd("target core " + coreFileName().toLocal8Bit()); - cmd.callback = CB(handleTargetCore); - runCommand(cmd); + runCommand({"target core " + coreFileName().toLocal8Bit(), NoFlags, + CB(handleTargetCore)}); } void GdbCoreEngine::handleTargetCore(const DebuggerResponse &response) @@ -252,7 +250,7 @@ void GdbCoreEngine::handleTargetCore(const DebuggerResponse &response) // symbols yet. Load them in order of importance. reloadStack(); reloadModulesInternal(); - runCommand("p 5", CB(handleRoundTrip)); + runCommand({"p 5", NoFlags, CB(handleRoundTrip)}); return; } showStatusMessage(tr("Attach to core \"%1\" failed:").arg(runParameters().coreFile) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 5621613c2fd438fe1e9cd1b5dfc9d0c8480697c1..c12ed2ece8452462d1109d52db24fc7b5411eaf8 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -851,7 +851,7 @@ void GdbEngine::interruptInferior() return; if (usesExecInterrupt()) { - runCommand("-exec-interrupt"); + runCommand({"-exec-interrupt", NoFlags}); } else { showStatusMessage(tr("Stop requested..."), 5000); showMessage(_("TRYING TO INTERRUPT INFERIOR")); @@ -898,20 +898,6 @@ void GdbEngine::maybeHandleInferiorPidChanged(const QString &pid0) notifyInferiorPid(pid); } -void GdbEngine::runCommand(const QByteArray &command, const DebuggerCommand::Callback &callback, int flags) -{ - DebuggerCommand cmd(command); - cmd.callback = callback; - cmd.flags = flags; - runCommand(cmd); -} - -void GdbEngine::runCommand(const QByteArray &command, int flags) -{ - DebuggerCommand cmd(command, flags); - runCommand(cmd); -} - void GdbEngine::runCommand(const DebuggerCommand &command) { const int token = ++currentToken(); @@ -1227,7 +1213,7 @@ void GdbEngine::executeDebuggerCommand(const QString &command, DebuggerLanguages if (!(languages & CppLanguage)) return; QTC_CHECK(acceptsDebuggerCommands()); - runCommand(command.toLatin1()); + runCommand({command.toLatin1(), NoFlags}); } // This is triggered when switching snapshots. @@ -1240,7 +1226,7 @@ void GdbEngine::updateAll() cmd.callback = [this](const DebuggerResponse &r) { handleStackListFrames(r, false); }; runCommand(cmd); stackHandler()->setCurrentIndex(0); - runCommand("-thread-info", CB(handleThreadInfo)); + runCommand({"-thread-info", NoFlags, CB(handleThreadInfo)}); reloadRegisters(); updateLocals(); } @@ -1386,9 +1372,8 @@ void GdbEngine::handleStopResponse(const GdbMi &data) bool gotoHandleStop1 = true; if (!m_fullStartDone) { m_fullStartDone = true; - DebuggerCommand cmd("sharedlibrary .*"); - cmd.callback = [this, data](const DebuggerResponse &) { handleStop1(data); }; - runCommand(cmd); + runCommand({"sharedlibrary .*", NoFlags, + [this, data](const DebuggerResponse &) { handleStop1(data); }}); gotoHandleStop1 = false; } @@ -1544,9 +1529,9 @@ void GdbEngine::handleStop1(const GdbMi &data) if (!m_systemDumpersLoaded) { m_systemDumpersLoaded = true; if (m_gdbVersion >= 70400 && boolSetting(LoadGdbDumpers)) - runCommand("importPlainDumpers on"); + runCommand({"importPlainDumpers on", NoFlags}); else - runCommand("importPlainDumpers off"); + runCommand({"importPlainDumpers off", NoFlags}); } handleStop2(data); @@ -1701,12 +1686,12 @@ void GdbEngine::handleShowVersion(const DebuggerResponse &response) .arg(gdbBuildVersion).arg(_(isMacGdb ? " (APPLE)" : ""))); if (usesExecInterrupt()) - runCommand("set target-async on", ConsoleCommand); + runCommand({"set target-async on", ConsoleCommand}); else - runCommand("set target-async off", ConsoleCommand); + runCommand({"set target-async off", ConsoleCommand}); if (runParameters().multiProcess) - runCommand("set detach-on-fork off", ConsoleCommand); + runCommand({"set detach-on-fork off", ConsoleCommand}); //runCommand("set build-id-verbose 2", ConsoleCommand); } @@ -1892,8 +1877,8 @@ void GdbEngine::notifyAdapterShutdownOk() switch (m_gdbProc.state()) { case QProcess::Running: { if (runParameters().closeMode == KillAndExitMonitorAtClose) - runCommand("monitor exit"); - runCommand("exitGdb", CB(handleGdbExit), ExitRequest|PythonCommand); + runCommand({"monitor exit", NoFlags}); + runCommand({"exitGdb", ExitRequest|PythonCommand, CB(handleGdbExit)}); break; } case QProcess::NotRunning: @@ -2093,20 +2078,19 @@ void GdbEngine::executeStepI() void GdbEngine::executeStepOut() { CHECK_STATE(InferiorStopOk); - runCommand("-stack-select-frame 0", Discardable); + runCommand({"-stack-select-frame 0", Discardable}); setTokenBarrier(); notifyInferiorRunRequested(); showStatusMessage(tr("Finish function requested..."), 5000); if (isNativeMixedActiveFrame()) { - DebuggerCommand cmd("executeStepOut", RunRequest|PythonCommand); - runCommand(cmd); + runCommand({"executeStepOut", RunRequest|PythonCommand}); } else { - runCommand("-exec-finish", CB(handleExecuteContinue), RunRequest); + runCommand({"-exec-finish", RunRequest, CB(handleExecuteContinue)}); // -exec-finish in 'main' results (correctly) in // 40^error,msg="\"finish\" not meaningful in the outermost frame." // However, this message does not seem to get flushed before // anything else happen - i.e. "never". Force some extra output. - runCommand("print 32"); + runCommand({"print 32"}); } } @@ -2186,11 +2170,9 @@ void GdbEngine::executeRunToLine(const ContextData &data) else loc = '"' + breakLocation(data.fileName).toLocal8Bit() + '"' + ':' + QByteArray::number(data.lineNumber); - runCommand("tbreak " + loc); + runCommand({"tbreak " + loc, NoFlags}); - DebuggerCommand cmd("continue", RunRequest); - cmd.callback = CB(handleExecuteRunToLine); - runCommand(cmd); + runCommand({"continue", RunRequest, CB(handleExecuteRunToLine)}); #else // Seems to jump to unpredicatable places. Observed in the manual // tests in the Foo::Foo() constructor with both gdb 6.8 and 7.1. @@ -2204,7 +2186,7 @@ void GdbEngine::executeRunToFunction(const QString &functionName) { CHECK_STATE(InferiorStopOk); setTokenBarrier(); - runCommand("-break-insert -t " + functionName.toLatin1()); + runCommand({"-break-insert -t " + functionName.toLatin1(), NoFlags}); showStatusMessage(tr("Run to function %1 requested...").arg(functionName), 5000); continueInferiorInternal(); } @@ -2218,12 +2200,10 @@ void GdbEngine::executeJumpToLine(const ContextData &data) else loc = '"' + breakLocation(data.fileName).toLocal8Bit() + '"' + ':' + QByteArray::number(data.lineNumber); - runCommand("tbreak " + loc); + runCommand({"tbreak " + loc, NoFlags}); notifyInferiorRunRequested(); - DebuggerCommand cmd("jump" + loc, RunRequest); - cmd.callback = CB(handleExecuteJumpToLine); - runCommand(cmd); + runCommand({"jump" + loc, RunRequest, CB(handleExecuteJumpToLine)}); // will produce something like // &"jump \"/home/apoenitz/dev/work/test1/test1.cpp\":242" // ~"Continuing at 0x4058f3." @@ -2238,7 +2218,7 @@ void GdbEngine::executeReturn() setTokenBarrier(); notifyInferiorRunRequested(); showStatusMessage(tr("Immediate return from function requested..."), 5000); - runCommand("-exec-finish", CB(handleExecuteReturn), RunRequest); + runCommand({"-exec-finish", RunRequest, CB(handleExecuteReturn)}); } void GdbEngine::handleExecuteReturn(const DebuggerResponse &response) @@ -2891,7 +2871,7 @@ void GdbEngine::removeBreakpoint(Breakpoint bp) void GdbEngine::loadSymbols(const QString &modulePath) { // FIXME: gdb does not understand quoted names here (tested with 6.8) - runCommand("sharedlibrary " + dotEscape(modulePath.toLocal8Bit())); + runCommand({"sharedlibrary " + dotEscape(modulePath.toLocal8Bit()), NoFlags}); reloadModulesInternal(); reloadStack(); updateLocals(); @@ -2899,7 +2879,7 @@ void GdbEngine::loadSymbols(const QString &modulePath) void GdbEngine::loadAllSymbols() { - runCommand("sharedlibrary .*"); + runCommand({"sharedlibrary .*", NoFlags}); reloadModulesInternal(); reloadStack(); updateLocals(); @@ -2915,8 +2895,8 @@ void GdbEngine::loadSymbolsForStack() foreach (const Module &module, modules) { if (module.startAddress <= frame.address && frame.address < module.endAddress) { - runCommand("sharedlibrary " - + dotEscape(module.modulePath.toLocal8Bit())); + runCommand({"sharedlibrary " + dotEscape(module.modulePath.toLocal8Bit()), + NoFlags}); needUpdate = true; } } @@ -3059,7 +3039,7 @@ void GdbEngine::reloadModules() void GdbEngine::reloadModulesInternal() { - runCommand("info shared", CB(handleModulesList), NeedsStop); + runCommand({"info shared", NeedsStop, CB(handleModulesList)}); } static QString nameFromPath(const QString &path) @@ -3246,10 +3226,9 @@ void GdbEngine::loadAdditionalQmlStack() return; } // Call the debug function of QML with the context address to obtain the QML stack trace. - DebuggerCommand cmd = "-data-evaluate-expression \"qt_v4StackTrace((QV4::ExecutionContext *)0x" - + QByteArray::number(contextAddress, 16) + ")\""; - cmd.callback = CB(handleQmlStackTrace); - runCommand(cmd); + runCommand({"-data-evaluate-expression \"qt_v4StackTrace((QV4::ExecutionContext *)0x" + + QByteArray::number(contextAddress, 16) + ")\"", + NoFlags, CB(handleQmlStackTrace)}); }; runCommand(cmd); } @@ -3345,8 +3324,7 @@ void GdbEngine::activateFrame(int frameIndex) // after a response to this -stack-select-frame here. //if (!m_currentThread.isEmpty()) // cmd += " --thread " + m_currentThread; - DebuggerCommand cmd("-stack-select-frame " + QByteArray::number(frameIndex), Discardable); - runCommand(cmd); + runCommand({"-stack-select-frame " + QByteArray::number(frameIndex), Discardable}); } updateLocals(); @@ -3366,14 +3344,14 @@ void GdbEngine::handleThreadInfo(const DebuggerResponse &response) } updateViews(); // Adjust Threads combobox. if (boolSetting(ShowThreadNames)) { - runCommand("threadnames " + action(MaximalStackDepth)->value().toByteArray(), - CB(handleThreadNames), Discardable); + runCommand({"threadnames " + action(MaximalStackDepth)->value().toByteArray(), + Discardable, CB(handleThreadNames)}); } reloadStack(); // Will trigger register reload. } else { // Fall back for older versions: Try to get at least a list // of running threads. - runCommand("-thread-list-ids", CB(handleThreadListIds), Discardable); + runCommand({"-thread-list-ids", Discardable, CB(handleThreadListIds)}); } } @@ -3474,15 +3452,17 @@ void GdbEngine::reloadRegisters() if (!m_registerNamesListed) { // The MI version does not give register size. // runCommand("-data-list-register-names", CB(handleRegisterListNames)); - runCommand("maintenance print raw-registers", CB(handleRegisterListing)); + runCommand({"maintenance print raw-registers", NoFlags, + CB(handleRegisterListing)}); m_registerNamesListed = true; } // Can cause i386-linux-nat.c:571: internal-error: Got request // for bad register number 41.\nA problem internal to GDB has been detected. - runCommand("-data-list-register-values r", - CB(handleRegisterListValues), Discardable); + runCommand({"-data-list-register-values r", Discardable, + CB(handleRegisterListValues)}); } else { - runCommand("maintenance print cooked-registers", CB(handleMaintPrintRegisters)); + runCommand({"maintenance print cooked-registers", NoFlags, + CB(handleMaintPrintRegisters)}); } } @@ -3547,7 +3527,7 @@ void GdbEngine::setRegisterValue(const QByteArray &name, const QString &value) QByteArray fullName = name; if (name.startsWith("xmm")) fullName += ".uint128"; - runCommand("set $" + fullName + "=" + value.toLatin1()); + runCommand({"set $" + fullName + "=" + value.toLatin1(), NoFlags}); reloadRegisters(); } @@ -3684,9 +3664,8 @@ void GdbEngine::watchPoint(const QPoint &pnt) { QByteArray x = QByteArray::number(pnt.x()); QByteArray y = QByteArray::number(pnt.y()); - runCommand("print " + qtNamespace() + "QApplication::widgetAt(" - + x + ',' + y + ')', - CB(handleWatchPoint), NeedsStop); + runCommand({"print " + qtNamespace() + "QApplication::widgetAt(" + x + ',' + y + ')', + NeedsStop, CB(handleWatchPoint)}); } void GdbEngine::handleWatchPoint(const DebuggerResponse &response) @@ -3822,9 +3801,9 @@ public: void GdbEngine::fetchDisassembler(DisassemblerAgent *agent) { if (boolSetting(IntelFlavor)) - runCommand("set disassembly-flavor intel"); + runCommand({"set disassembly-flavor intel"}); else - runCommand("set disassembly-flavor att"); + runCommand({"set disassembly-flavor att"}); fetchDisassemblerByCliPointMixed(agent); } @@ -4025,9 +4004,9 @@ void GdbEngine::startGdb(const QStringList &args) } showMessage(_("GDB STARTED, INITIALIZING IT")); - runCommand("show version", CB(handleShowVersion)); + runCommand({"show version", NoFlags, CB(handleShowVersion)}); //runCommand("-list-features", CB(handleListFeatures)); - runCommand("show debug-file-directory",CB(handleDebugInfoLocation)); + runCommand({"show debug-file-directory", NoFlags, CB(handleDebugInfoLocation)}); //runCommand("-enable-timings"); //rurun print static-members off"); // Seemingly doesn't work. @@ -4037,7 +4016,7 @@ void GdbEngine::startGdb(const QStringList &args) //runCommand("define hookpost-stop\nprint 5\nend"); //runCommand("define hook-call\nprint 6\nend"); //runCommand("define hookpost-call\nprint 7\nend"); - runCommand("set print object on"); + runCommand({"set print object on"}); //runCommand("set step-mode on"); // we can't work with that yes //runCommand("set exec-done-display on"); //runCommand("set print pretty on"); @@ -4048,8 +4027,8 @@ void GdbEngine::startGdb(const QStringList &args) // (Mac OS 10.6), but does so for gdb-966 (10.5): //runCommand("set print inferior-events 1"); - runCommand("set breakpoint pending on"); - runCommand("set print elements 10000"); + runCommand({"set breakpoint pending on"}); + runCommand({"set print elements 10000"}); // Produces a few messages during symtab loading //runCommand("set verbose on"); @@ -4077,11 +4056,11 @@ void GdbEngine::startGdb(const QStringList &args) // We need "print" as otherwise we will get no feedback whatsoever // when Custom DebuggingHelper crash (which happen regularly when accessing // uninitialized variables). - runCommand("handle SIGSEGV nopass stop print"); + runCommand({"handle SIGSEGV nopass stop print"}); - runCommand("set unwindonsignal on"); - runCommand("set width 0"); - runCommand("set height 0"); + runCommand({"set unwindonsignal on"}); + runCommand({"set width 0"}); + runCommand({"set height 0"}); // FIXME: Provide proper Gui settings for these: //runCommand("set breakpoint always-inserted on", ConsoleCommand); @@ -4111,39 +4090,39 @@ void GdbEngine::startGdb(const QStringList &args) for (auto it = completeSourcePathMap.constBegin(), cend = completeSourcePathMap.constEnd(); it != cend; ++it) { - runCommand("set substitute-path " + it.key().toLocal8Bit() - + " " + it.value().toLocal8Bit()); + runCommand({"set substitute-path " + it.key().toLocal8Bit() + + " " + it.value().toLocal8Bit(), NoFlags}); } // Spaces just will not work. foreach (const QString &src, rp.debugSourceLocation) { if (QDir(src).exists()) - runCommand("directory " + src.toLocal8Bit()); + runCommand({"directory " + src.toLocal8Bit(), NoFlags}); else showMessage(_("# directory does not exist: ") + src, LogInput); } const QByteArray sysroot = rp.sysRoot.toLocal8Bit(); if (!sysroot.isEmpty()) { - runCommand("set sysroot " + sysroot); + runCommand({"set sysroot " + sysroot, NoFlags}); // sysroot is not enough to correctly locate the sources, so explicitly // relocate the most likely place for the debug source - runCommand("set substitute-path /usr/src " + sysroot + "/usr/src"); + runCommand({"set substitute-path /usr/src " + sysroot + "/usr/src", NoFlags}); } //QByteArray ba = QFileInfo(sp.dumperLibrary).path().toLocal8Bit(); //if (!ba.isEmpty()) // runCommand("set solib-search-path " + ba); if (attemptQuickStart()) { - runCommand("set auto-solib-add off", ConsoleCommand); + runCommand({"set auto-solib-add off", ConsoleCommand}); } else { m_fullStartDone = true; - runCommand("set auto-solib-add on", ConsoleCommand); + runCommand({"set auto-solib-add on", ConsoleCommand}); } if (boolSetting(MultiInferior)) { //runCommand("set follow-exec-mode new"); - runCommand("set detach-on-fork off"); + runCommand({"set detach-on-fork off"}); } // Finally, set up Python. @@ -4154,15 +4133,15 @@ void GdbEngine::startGdb(const QStringList &args) ICore::resourcePath().toLocal8Bit() + "/debugger/"; if (terminal()->isUsable()) - runCommand("set inferior-tty " + terminal()->slaveDevice()); + runCommand({"set inferior-tty " + terminal()->slaveDevice(), NoFlags}); const QFileInfo gdbBinaryFile(m_gdb); const QByteArray uninstalledData = gdbBinaryFile.absolutePath().toLocal8Bit() + "/data-directory/python"; - runCommand("python sys.path.insert(1, '" + dumperSourcePath + "')"); - runCommand("python sys.path.append('" + uninstalledData + "')"); - runCommand("python from gdbbridge import *"); + runCommand({"python sys.path.insert(1, '" + dumperSourcePath + "')", NoFlags}); + runCommand({"python sys.path.append('" + uninstalledData + "')", NoFlags}); + runCommand({"python from gdbbridge import *", NoFlags}); const QString path = stringSetting(ExtraDumperFile); if (!path.isEmpty() && QFileInfo(path).isReadable()) { @@ -4173,11 +4152,9 @@ void GdbEngine::startGdb(const QStringList &args) const QString commands = stringSetting(ExtraDumperCommands); if (!commands.isEmpty()) - runCommand(commands.toLocal8Bit()); + runCommand({commands.toLocal8Bit(), NoFlags}); - DebuggerCommand cmd("loadDumpers", PythonCommand); - cmd.callback = CB(handlePythonSetup); - runCommand(cmd); + runCommand({"loadDumpers", PythonCommand, CB(handlePythonSetup)}); } void GdbEngine::handleGdbStartFailed() @@ -4189,7 +4166,7 @@ void GdbEngine::loadInitScript() const QString script = runParameters().overrideStartScript; if (!script.isEmpty()) { if (QFileInfo(script).isReadable()) { - runCommand("source " + script.toLocal8Bit()); + runCommand({"source " + script.toLocal8Bit(), NoFlags}); } else { AsynchronousMessageBox::warning( tr("Cannot find debugger initialization script"), @@ -4201,7 +4178,7 @@ void GdbEngine::loadInitScript() } else { const QString commands = stringSetting(GdbStartupCommands); if (!commands.isEmpty()) - runCommand(commands.toLocal8Bit()); + runCommand({commands.toLocal8Bit(), NoFlags}); } } @@ -4211,15 +4188,16 @@ void GdbEngine::setEnvironmentVariables() Environment runEnv = runParameters().environment; foreach (const EnvironmentItem &item, sysEnv.diff(runEnv)) { if (item.unset) - runCommand("unset environment " + item.name.toUtf8()); + runCommand({"unset environment " + item.name.toUtf8(), NoFlags}); else - runCommand("-gdb-set environment " + item.name.toUtf8() + '=' + item.value.toUtf8()); + runCommand({"-gdb-set environment " + item.name.toUtf8() + '=' + + item.value.toUtf8(), NoFlags}); } } void GdbEngine::reloadDebuggingHelpers() { - runCommand("reloadDumpers", PythonCommand); + runCommand({"reloadDumpers", PythonCommand}); reloadLocals(); } @@ -4274,7 +4252,7 @@ void GdbEngine::resetInferior() foreach (QByteArray command, commands.split('\n')) { command = command.trimmed(); if (!command.isEmpty()) - runCommand(command, int(ConsoleCommand | NeedsStop)); + runCommand({command, ConsoleCommand | NeedsStop}); } } m_rerunPending = true; @@ -4313,16 +4291,15 @@ void GdbEngine::handleInferiorPrepared() if (!rp.commandsAfterConnect.isEmpty()) { QByteArray commands = globalMacroExpander()->expand(rp.commandsAfterConnect); - foreach (QByteArray command, commands.split('\n')) { - runCommand(command); - } + foreach (QByteArray command, commands.split('\n')) + runCommand({command, NoFlags}); } //runCommand("set follow-exec-mode new"); if (rp.breakOnMain) { QByteArray cmd = "tbreak "; cmd += rp.toolChainAbi.os() == Abi::WindowsOS ? "qMain" : "main"; - runCommand(cmd); + runCommand({cmd, NoFlags}); } // Initial attempt to set breakpoints. @@ -4348,15 +4325,15 @@ void GdbEngine::finishInferiorSetup() notifyInferiorSetupOk(); // No breakpoints in core files. } else { if (boolSetting(BreakOnAbort)) - runCommand("-break-insert -f abort"); + runCommand({"-break-insert -f abort"}); if (boolSetting(BreakOnWarning)) { - runCommand("-break-insert -f '" + qtNamespace() + "qWarning'"); - runCommand("-break-insert -f '" + qtNamespace() + "QMessageLogger::warning'"); + runCommand({"-break-insert -f '" + qtNamespace() + "qWarning'", NoFlags}); + runCommand({"-break-insert -f '" + qtNamespace() + "QMessageLogger::warning'", NoFlags}); } if (boolSetting(BreakOnFatal)) { auto cb = [this](const DebuggerResponse &r) { handleBreakOnQFatal(r, false); }; - runCommand("-break-insert -f '" + qtNamespace() + "qFatal'", cb); - runCommand("-break-insert -f '" + qtNamespace() + "QMessageLogger::fatal'", cb); + runCommand({"-break-insert -f '" + qtNamespace() + "qFatal'", NoFlags, cb}); + runCommand({"-break-insert -f '" + qtNamespace() + "QMessageLogger::fatal'", NoFlags, cb}); } else { notifyInferiorSetupOk(); } @@ -4369,13 +4346,10 @@ void GdbEngine::handleDebugInfoLocation(const DebuggerResponse &response) const QByteArray debugInfoLocation = runParameters().debugInfoLocation.toLocal8Bit(); if (QFile::exists(QString::fromLocal8Bit(debugInfoLocation))) { const QByteArray curDebugInfoLocations = response.consoleStreamOutput.split('"').value(1); - if (curDebugInfoLocations.isEmpty()) { - runCommand("set debug-file-directory " + debugInfoLocation); - } else { - runCommand("set debug-file-directory " + debugInfoLocation - + HostOsInfo::pathListSeparator().toLatin1() - + curDebugInfoLocations); - } + QByteArray cmd = "set debug-file-directory " + debugInfoLocation; + if (!curDebugInfoLocations.isEmpty()) + cmd += HostOsInfo::pathListSeparator().toLatin1() + curDebugInfoLocations; + runCommand({cmd, NoFlags}); } } } @@ -4388,7 +4362,7 @@ void GdbEngine::handleBreakOnQFatal(const DebuggerResponse &response, bool conti BreakpointResponseId rid(number.data()); if (rid.isValid()) { m_qFatalBreakpointResponseId = rid; - runCommand("-break-commands " + number.data() + " return"); + runCommand({"-break-commands " + number.data() + " return", NoFlags}); } } diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index cee83ca3a98cb7cc23a83eae01ab79d3a934d1e2..7083c11aa87294eceaa5720dbace48f1657a1f4b 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -172,12 +172,7 @@ private: ////////// Gdb Command Management ////////// }; Q_DECLARE_FLAGS(GdbCommandFlags, GdbCommandFlag) -protected: - void runCommand(const DebuggerCommand &command); - void runCommand(const QByteArray &command, int flags); - void runCommand(const QByteArray &command, - const DebuggerCommand::Callback &callback, - int flags = NoFlags); + void runCommand(const DebuggerCommand &command) override; private: Q_SLOT void commandTimeout(); diff --git a/src/plugins/debugger/gdb/gdbplainengine.cpp b/src/plugins/debugger/gdb/gdbplainengine.cpp index 80e6d18e5b67fc5315df08fe6377e4699e661a0a..37568f726f6980eb37d3d37ff1c06dc14250d70b 100644 --- a/src/plugins/debugger/gdb/gdbplainengine.cpp +++ b/src/plugins/debugger/gdb/gdbplainengine.cpp @@ -60,10 +60,10 @@ void GdbPlainEngine::setupInferior() setEnvironmentVariables(); if (!runParameters().processArgs.isEmpty()) { QString args = runParameters().processArgs; - runCommand("-exec-arguments " + toLocalEncoding(args)); + runCommand({"-exec-arguments " + toLocalEncoding(args), NoFlags}); } - runCommand("-file-exec-and-symbols \"" + execFilePath() + '"', - CB(handleFileExecAndSymbols)); + runCommand({"-file-exec-and-symbols \"" + execFilePath() + '"', NoFlags, + CB(handleFileExecAndSymbols)}); } void GdbPlainEngine::handleFileExecAndSymbols(const DebuggerResponse &response) @@ -84,9 +84,9 @@ void GdbPlainEngine::handleFileExecAndSymbols(const DebuggerResponse &response) void GdbPlainEngine::runEngine() { if (runParameters().useContinueInsteadOfRun) - runCommand("-exec-continue", CB(handleExecuteContinue), RunRequest); + runCommand({"-exec-continue", RunRequest, CB(handleExecuteContinue)}); else - runCommand("-exec-run", CB(handleExecRun), RunRequest); + runCommand({"-exec-run", RunRequest, CB(handleExecRun)}); } void GdbPlainEngine::handleExecRun(const DebuggerResponse &response) { @@ -98,7 +98,7 @@ void GdbPlainEngine::handleExecRun(const DebuggerResponse &response) showMessage(msgInferiorSetupOk(), StatusBar); // FIXME: That's the wrong place for it. if (boolSetting(EnableReverseDebugging)) - runCommand("target record"); + runCommand({"target record", NoFlags}); } else { QString msg = fromLocalEncoding(response.data["msg"].data()); //QTC_CHECK(status() == InferiorRunOk); diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index 75d7f9b633ca2f02c354511f3498c157345443a6..98488d1a047a7e159bc4e77bfb648608ce367490 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -183,10 +183,10 @@ void GdbRemoteServerEngine::setupInferior() // postCommand("set architecture " + remoteArch); const QString solibSearchPath = rp.solibSearchPath.join(HostOsInfo::pathListSeparator()); if (!solibSearchPath.isEmpty()) - runCommand("set solib-search-path " + solibSearchPath.toLocal8Bit()); + runCommand({"set solib-search-path " + solibSearchPath.toLocal8Bit(), NoFlags}); if (!args.isEmpty()) - runCommand("-exec-arguments " + args.toLocal8Bit()); + runCommand({"-exec-arguments " + args.toLocal8Bit(), NoFlags}); setEnvironmentVariables(); @@ -210,7 +210,7 @@ void GdbRemoteServerEngine::setupInferior() // mi_execute_async_cli_command: Assertion `is_running (inferior_ptid)' // failed.\nA problem internal to GDB has been detected,[...] if (boolSetting(TargetAsync)) - runCommand("set target-async on", CB(handleSetTargetAsync)); + runCommand({"set target-async on", NoFlags, CB(handleSetTargetAsync)}); if (executableFileName.isEmpty()) { showMessage(tr("No symbol file given."), StatusBar); @@ -219,8 +219,8 @@ void GdbRemoteServerEngine::setupInferior() } if (!executableFileName.isEmpty()) { - runCommand("-file-exec-and-symbols \"" + executableFileName.toLocal8Bit() + '"', - CB(handleFileExecAndSymbols)); + runCommand({"-file-exec-and-symbols \"" + executableFileName.toLocal8Bit() + '"', + NoFlags, CB(handleFileExecAndSymbols)}); } } @@ -270,11 +270,11 @@ void GdbRemoteServerEngine::callTargetRemote() } if (m_isQnxGdb) - runCommand("target qnx " + channel, CB(handleTargetQnx)); + runCommand({"target qnx " + channel, NoFlags, CB(handleTargetQnx)}); else if (runParameters().multiProcess) - runCommand("target extended-remote " + channel, CB(handleTargetExtendedRemote)); + runCommand({"target extended-remote " + channel, NoFlags, CB(handleTargetExtendedRemote)}); else - runCommand("target remote " + channel, CB(handleTargetRemote)); + runCommand({"target remote " + channel, NoFlags, CB(handleTargetRemote)}); } void GdbRemoteServerEngine::handleTargetRemote(const DebuggerResponse &response) @@ -287,7 +287,7 @@ void GdbRemoteServerEngine::handleTargetRemote(const DebuggerResponse &response) QString postAttachCommands = stringSetting(GdbPostAttachCommands); if (!postAttachCommands.isEmpty()) { foreach (const QString &cmd, postAttachCommands.split(QLatin1Char('\n'))) - runCommand(cmd.toLatin1()); + runCommand({cmd.toLatin1(), NoFlags}); } handleInferiorPrepared(); } else { @@ -307,15 +307,15 @@ void GdbRemoteServerEngine::handleTargetExtendedRemote(const DebuggerResponse &r QString postAttachCommands = stringSetting(GdbPostAttachCommands); if (!postAttachCommands.isEmpty()) { foreach (const QString &cmd, postAttachCommands.split(QLatin1Char('\n'))) - runCommand(cmd.toLatin1()); + runCommand({cmd.toLatin1(), NoFlags}); } if (runParameters().attachPID > 0) { // attach to pid if valid // gdb server will stop the remote application itself. - runCommand("attach " + QByteArray::number(runParameters().attachPID), - CB(handleTargetExtendedAttach)); + runCommand({"attach " + QByteArray::number(runParameters().attachPID), + NoFlags, CB(handleTargetExtendedAttach)}); } else { - runCommand("-gdb-set remote exec-file " + runParameters().remoteExecutable.toLatin1(), - CB(handleTargetExtendedAttach)); + runCommand({"-gdb-set remote exec-file " + runParameters().remoteExecutable.toLatin1(), + NoFlags, CB(handleTargetExtendedAttach)}); } } else { QString msg = msgConnectRemoteServerFailed( @@ -349,9 +349,9 @@ void GdbRemoteServerEngine::handleTargetQnx(const DebuggerResponse &response) const qint64 pid = isMasterEngine() ? runParameters().attachPID : masterEngine()->runParameters().attachPID; const QString remoteExecutable = isMasterEngine() ? runParameters().remoteExecutable : masterEngine()->runParameters().remoteExecutable; if (pid > -1) - runCommand("attach " + QByteArray::number(pid), CB(handleAttach)); + runCommand({"attach " + QByteArray::number(pid), NoFlags, CB(handleAttach)}); else if (!remoteExecutable.isEmpty()) - runCommand("set nto-executable " + remoteExecutable.toLatin1(), CB(handleSetNtoExecutable)); + runCommand({"set nto-executable " + remoteExecutable.toLatin1(), NoFlags, CB(handleSetNtoExecutable)}); else handleInferiorPrepared(); } else { @@ -409,7 +409,7 @@ void GdbRemoteServerEngine::runEngine() const QString remoteExecutable = runParameters().remoteExecutable; if (!remoteExecutable.isEmpty()) { - runCommand("-exec-run", CB(handleExecRun), RunRequest); + runCommand({"-exec-run", RunRequest, CB(handleExecRun)}); } else { notifyEngineRunAndInferiorStopOk(); continueInferiorInternal(); @@ -434,7 +434,7 @@ void GdbRemoteServerEngine::interruptInferior2() { QTC_ASSERT(state() == InferiorStopRequested, qDebug() << state()); if (boolSetting(TargetAsync)) { - runCommand("-exec-interrupt", CB(handleInterruptInferior)); + runCommand({"-exec-interrupt", NoFlags, CB(handleInterruptInferior)}); } else if (m_isQnxGdb && HostOsInfo::isWindowsHost()) { m_gdbProc.interrupt(); } else { diff --git a/src/plugins/debugger/gdb/termgdbadapter.cpp b/src/plugins/debugger/gdb/termgdbadapter.cpp index a53b6b9729ccbc56be1df0f89d8b22455d0b1eee..f50388ee0e7d39591d92ee942d3db8fad25ed053 100644 --- a/src/plugins/debugger/gdb/termgdbadapter.cpp +++ b/src/plugins/debugger/gdb/termgdbadapter.cpp @@ -134,9 +134,8 @@ void GdbTermEngine::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); const qint64 attachedPID = m_stubProc.applicationPID(); - DebuggerCommand cmd("attach " + QByteArray::number(attachedPID)); - cmd.callback = [this](const DebuggerResponse &r) { handleStubAttached(r); }; - runCommand(cmd); + runCommand({"attach " + QByteArray::number(attachedPID), NoFlags, + [this](const DebuggerResponse &r) { handleStubAttached(r); }}); } void GdbTermEngine::handleStubAttached(const DebuggerResponse &response) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index bb5fa23620e14c8fdb984e2493f77dac09e1a2ca..a372709977d5b935622c81a33c31b6962512d719 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -130,17 +130,17 @@ void LldbEngine::executeDebuggerCommand(const QString &command, DebuggerLanguage runCommand(cmd); } -void LldbEngine::runCommand(const DebuggerCommand &command_) +void LldbEngine::runCommand(const DebuggerCommand &cmd) { QTC_ASSERT(m_lldbProc.state() == QProcess::Running, notifyEngineIll()); const int tok = ++currentToken(); - DebuggerCommand command = command_; + DebuggerCommand command = cmd; command.arg("token", tok); QByteArray token = QByteArray::number(tok); - QByteArray cmd = command.function + "(" + command.argsToPython() + ")"; - showMessage(_(token + cmd + '\n'), LogInput); + QByteArray function = command.function + "(" + command.argsToPython() + ")"; + showMessage(_(token + function + '\n'), LogInput); m_commandForToken[currentToken()] = command; - m_lldbProc.write("script theDumper." + cmd + "\n"); + m_lldbProc.write("script theDumper." + function + "\n"); } void LldbEngine::debugLastCommand() @@ -151,7 +151,7 @@ void LldbEngine::debugLastCommand() void LldbEngine::shutdownInferior() { QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << state()); - runCommand(DebuggerCommand("shutdownInferior")); + runCommand({"shutdownInferior"}); } void LldbEngine::shutdownEngine() @@ -405,37 +405,37 @@ void LldbEngine::runEngine() void LldbEngine::interruptInferior() { showStatusMessage(tr("Interrupt requested..."), 5000); - runCommand("interruptInferior"); + runCommand({"interruptInferior"}); } void LldbEngine::executeStep() { notifyInferiorRunRequested(); - runCommand("executeStep"); + runCommand({"executeStep"}); } void LldbEngine::executeStepI() { notifyInferiorRunRequested(); - runCommand("executeStepI"); + runCommand({"executeStepI"}); } void LldbEngine::executeStepOut() { notifyInferiorRunRequested(); - runCommand("executeStepOut"); + runCommand({"executeStepOut"}); } void LldbEngine::executeNext() { notifyInferiorRunRequested(); - runCommand("executeNext"); + runCommand({"executeNext"}); } void LldbEngine::executeNextI() { notifyInferiorRunRequested(); - runCommand("executeNextI"); + runCommand({"executeNextI"}); } void LldbEngine::continueInferior() @@ -984,7 +984,7 @@ void LldbEngine::reloadRegisters() void LldbEngine::reloadDebuggingHelpers() { - runCommand("reloadDumpers"); + runCommand({"reloadDumpers"}); updateAll(); } @@ -1037,7 +1037,7 @@ void LldbEngine::fetchFullBacktrace() Internal::openTextEditor(_("Backtrace $"), QString::fromUtf8(QByteArray::fromHex(response.data.data()))); }; - runCommand("fetchFullBacktrace"); + runCommand(cmd); } void LldbEngine::fetchMemory(MemoryAgent *agent, QObject *editorToken, diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h index b655794a285650b5bf9f3a238c03d4eef24a41a0..60b604eb9e6fd0b79284722320a846ed468ce378 100644 --- a/src/plugins/debugger/lldb/lldbengine.h +++ b/src/plugins/debugger/lldb/lldbengine.h @@ -147,7 +147,7 @@ private: void notifyEngineRemoteSetupFinished(const RemoteSetupResult &result) override; - void runCommand(const DebuggerCommand &cmd); + void runCommand(const DebuggerCommand &cmd) override; void debugLastCommand() override; private: diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp index 7fa38015676f405c68a5271782b1c1b14cf30746..57b242dc4bc5bc580dfe68b8e65a34f0998770bf 100644 --- a/src/plugins/debugger/pdb/pdbengine.cpp +++ b/src/plugins/debugger/pdb/pdbengine.cpp @@ -300,7 +300,7 @@ void PdbEngine::loadAllSymbols() void PdbEngine::reloadModules() { - runCommand("listModules"); + runCommand({"listModules"}); } void PdbEngine::refreshModules(const GdbMi &modules) @@ -557,7 +557,7 @@ void PdbEngine::refreshStack(const GdbMi &stack) void PdbEngine::updateAll() { - runCommand("stackListFrames"); + runCommand({"stackListFrames"}); updateLocals(); } diff --git a/src/plugins/debugger/pdb/pdbengine.h b/src/plugins/debugger/pdb/pdbengine.h index 7fa34bb1d879562795f60e50b7a976508a749e12..ca3f595fc030ae3a261bffc730f0b77d6728a020 100644 --- a/src/plugins/debugger/pdb/pdbengine.h +++ b/src/plugins/debugger/pdb/pdbengine.h @@ -98,7 +98,7 @@ private: bool isSynchronous() const override { return true; } void updateItem(const QByteArray &iname) override; - void runCommand(const DebuggerCommand &cmd); + void runCommand(const DebuggerCommand &cmd) override; void postDirectCommand(const QByteArray &command); void refreshLocation(const GdbMi &reportedLocation); diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 5031575d29b61f7f68c978756951789aff59a01c..c4b6fcf7c77555cf6981538d8ca03732c9297682 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -612,7 +612,7 @@ void QmlEngine::shutdownInferior() // "type" : "request", // "command" : "disconnect", // } - d->runCommand(DISCONNECT); + d->runCommand({DISCONNECT}); if (isSlaveEngine()) resetLocation(); @@ -2504,7 +2504,7 @@ void QmlEnginePrivate::stateChanged(State state) /// Start session. flushSendBuffer(); runDirectCommand(CONNECT); - runCommand(VERSION); // Only used for logging. + runCommand({VERSION}); // Only used for logging. } }