Valgrind: Merge MemCheck{,WithGdb}ToolRunner

Change-Id: Iaf0707cf5c06ef29c33da835133948256869c76a
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2017-06-21 07:54:54 +02:00
parent 533f92c1bd
commit acc9da0861
3 changed files with 36 additions and 54 deletions

View File

@@ -51,16 +51,25 @@ using namespace Valgrind::XmlProtocol;
namespace Valgrind { namespace Valgrind {
namespace Internal { namespace Internal {
MemcheckToolRunner::MemcheckToolRunner(RunControl *runControl) MemcheckToolRunner::MemcheckToolRunner(RunControl *runControl, bool withGdb)
: ValgrindToolRunner(runControl) : ValgrindToolRunner(runControl), m_withGdb(withGdb)
{ {
setDisplayName("MemcheckToolRunner"); setDisplayName("MemcheckToolRunner");
connect(&m_parser, &XmlProtocol::ThreadedParser::error, connect(&m_parser, &XmlProtocol::ThreadedParser::error,
this, &MemcheckToolRunner::parserError); this, &MemcheckToolRunner::parserError);
connect(&m_parser, &XmlProtocol::ThreadedParser::suppressionCount, connect(&m_parser, &XmlProtocol::ThreadedParser::suppressionCount,
this, &MemcheckToolRunner::suppressionCount); this, &MemcheckToolRunner::suppressionCount);
connect(&m_parser, &XmlProtocol::ThreadedParser::internalError,
this, &MemcheckToolRunner::internalParserError); if (withGdb) {
connect(&m_runner, &Memcheck::MemcheckRunner::started,
this, &MemcheckToolRunner::startDebugger);
connect(&m_runner, &Memcheck::MemcheckRunner::logMessageReceived,
this, &MemcheckToolRunner::appendLog);
m_runner.disableXml();
} else {
connect(&m_parser, &XmlProtocol::ThreadedParser::internalError,
this, &MemcheckToolRunner::internalParserError);
}
} }
QString MemcheckToolRunner::progressTitle() const QString MemcheckToolRunner::progressTitle() const
@@ -94,35 +103,39 @@ void MemcheckToolRunner::stop()
QStringList MemcheckToolRunner::toolArguments() const QStringList MemcheckToolRunner::toolArguments() const
{ {
QStringList arguments; QStringList arguments;
arguments << QLatin1String("--gen-suppressions=all"); arguments << "--gen-suppressions=all";
QTC_ASSERT(m_settings, return arguments); QTC_ASSERT(m_settings, return arguments);
if (m_settings->trackOrigins()) if (m_settings->trackOrigins())
arguments << QLatin1String("--track-origins=yes"); arguments << "--track-origins=yes";
if (m_settings->showReachable()) if (m_settings->showReachable())
arguments << QLatin1String("--show-reachable=yes"); arguments << "--show-reachable=yes";
QString leakCheckValue; QString leakCheckValue;
switch (m_settings->leakCheckOnFinish()) { switch (m_settings->leakCheckOnFinish()) {
case ValgrindBaseSettings::LeakCheckOnFinishNo: case ValgrindBaseSettings::LeakCheckOnFinishNo:
leakCheckValue = QLatin1String("no"); leakCheckValue = "no";
break; break;
case ValgrindBaseSettings::LeakCheckOnFinishYes: case ValgrindBaseSettings::LeakCheckOnFinishYes:
leakCheckValue = QLatin1String("full"); leakCheckValue = "full";
break; break;
case ValgrindBaseSettings::LeakCheckOnFinishSummaryOnly: case ValgrindBaseSettings::LeakCheckOnFinishSummaryOnly:
default: default:
leakCheckValue = QLatin1String("summary"); leakCheckValue = "summary";
break; break;
} }
arguments << QLatin1String("--leak-check=") + leakCheckValue; arguments << "--leak-check=" + leakCheckValue;
foreach (const QString &file, m_settings->suppressionFiles()) foreach (const QString &file, m_settings->suppressionFiles())
arguments << QString::fromLatin1("--suppressions=%1").arg(file); arguments << QString("--suppressions=%1").arg(file);
arguments << QString("--num-callers=%1").arg(m_settings->numCallers());
if (m_withGdb)
arguments << "--vgdb=yes" << "--vgdb-error=0";
arguments << QString::fromLatin1("--num-callers=%1").arg(m_settings->numCallers());
return arguments; return arguments;
} }
@@ -131,25 +144,7 @@ QStringList MemcheckToolRunner::suppressionFiles() const
return m_settings->suppressionFiles(); return m_settings->suppressionFiles();
} }
MemcheckWithGdbToolRunner::MemcheckWithGdbToolRunner(RunControl *runControl) void MemcheckToolRunner::startDebugger()
: MemcheckToolRunner(runControl)
{
connect(&m_runner, &Memcheck::MemcheckRunner::started,
this, &MemcheckWithGdbToolRunner::startDebugger);
connect(&m_runner, &Memcheck::MemcheckRunner::logMessageReceived,
this, &MemcheckWithGdbToolRunner::appendLog);
disconnect(&m_parser, &ThreadedParser::internalError,
this, &MemcheckToolRunner::internalParserError);
m_runner.disableXml();
}
QStringList MemcheckWithGdbToolRunner::toolArguments() const
{
return MemcheckToolRunner::toolArguments()
<< QLatin1String("--vgdb=yes") << QLatin1String("--vgdb-error=0");
}
void MemcheckWithGdbToolRunner::startDebugger()
{ {
const qint64 valgrindPid = runner()->valgrindProcess()->pid(); const qint64 valgrindPid = runner()->valgrindProcess()->pid();
@@ -169,7 +164,7 @@ void MemcheckWithGdbToolRunner::startDebugger()
gdbRunControl->initiateStart(); gdbRunControl->initiateStart();
} }
void MemcheckWithGdbToolRunner::appendLog(const QByteArray &data) void MemcheckToolRunner::appendLog(const QByteArray &data)
{ {
appendMessage(QString::fromUtf8(data), Utils::StdOutFormat); appendMessage(QString::fromUtf8(data), Utils::StdOutFormat);
} }

View File

@@ -39,7 +39,8 @@ class MemcheckToolRunner : public ValgrindToolRunner
Q_OBJECT Q_OBJECT
public: public:
explicit MemcheckToolRunner(ProjectExplorer::RunControl *runControl); explicit MemcheckToolRunner(ProjectExplorer::RunControl *runControl,
bool withGdb = false);
void start() override; void start() override;
void stop() override; void stop() override;
@@ -51,27 +52,17 @@ signals:
void parserError(const Valgrind::XmlProtocol::Error &error); void parserError(const Valgrind::XmlProtocol::Error &error);
void suppressionCount(const QString &name, qint64 count); void suppressionCount(const QString &name, qint64 count);
protected: private:
QString progressTitle() const override; QString progressTitle() const override;
QStringList toolArguments() const override; QStringList toolArguments() const override;
ValgrindRunner *runner() override; ValgrindRunner *runner() override;
protected:
XmlProtocol::ThreadedParser m_parser;
Memcheck::MemcheckRunner m_runner;
};
class MemcheckWithGdbToolRunner : public MemcheckToolRunner
{
Q_OBJECT
public:
explicit MemcheckWithGdbToolRunner(ProjectExplorer::RunControl *runControl);
protected:
QStringList toolArguments() const override;
void startDebugger(); void startDebugger();
void appendLog(const QByteArray &data); void appendLog(const QByteArray &data);
XmlProtocol::ThreadedParser m_parser;
Memcheck::MemcheckRunner m_runner;
const bool m_withGdb;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -563,11 +563,7 @@ RunWorker *MemcheckTool::createRunWorker(RunControl *runControl)
m_errorModel.setRelevantFrameFinder(makeFrameFinder(runConfig m_errorModel.setRelevantFrameFinder(makeFrameFinder(runConfig
? runConfig->target()->project()->files(Project::AllFiles) : QStringList())); ? runConfig->target()->project()->files(Project::AllFiles) : QStringList()));
MemcheckToolRunner *runTool = 0; auto runTool = new MemcheckToolRunner(runControl, runControl->runMode() == MEMCHECK_WITH_GDB_RUN_MODE);
if (runControl->runMode() == MEMCHECK_RUN_MODE)
runTool = new MemcheckToolRunner(runControl);
else
runTool = new MemcheckWithGdbToolRunner(runControl);
connect(runTool, &MemcheckToolRunner::starting, connect(runTool, &MemcheckToolRunner::starting,
this, [this, runTool] { engineStarting(runTool); }); this, [this, runTool] { engineStarting(runTool); });