diff --git a/src/plugins/valgrind/memcheckengine.cpp b/src/plugins/valgrind/memcheckengine.cpp
index 2a0f767f11c..232b01e72fe 100644
--- a/src/plugins/valgrind/memcheckengine.cpp
+++ b/src/plugins/valgrind/memcheckengine.cpp
@@ -102,6 +102,24 @@ QStringList MemcheckRunControl::toolArguments() const
if (m_settings->trackOrigins())
arguments << QLatin1String("--track-origins=yes");
+ if (m_settings->showReachable())
+ arguments << QLatin1String("--show-reachable=yes");
+
+ QString leakCheckValue;
+ switch (m_settings->leakCheckOnFinish()) {
+ case ValgrindBaseSettings::LeakCheckOnFinishNo:
+ leakCheckValue = QLatin1String("no");
+ break;
+ case ValgrindBaseSettings::LeakCheckOnFinishYes:
+ leakCheckValue = QLatin1String("full");
+ break;
+ case ValgrindBaseSettings::LeakCheckOnFinishSummaryOnly:
+ default:
+ leakCheckValue = QLatin1String("summary");
+ break;
+ }
+ arguments << QLatin1String("--leak-check=") + leakCheckValue;
+
foreach (const QString &file, m_settings->suppressionFiles())
arguments << QString::fromLatin1("--suppressions=%1").arg(file);
diff --git a/src/plugins/valgrind/valgrindconfigwidget.cpp b/src/plugins/valgrind/valgrindconfigwidget.cpp
index bd35b5a0445..d4f3a99dcd8 100644
--- a/src/plugins/valgrind/valgrindconfigwidget.cpp
+++ b/src/plugins/valgrind/valgrindconfigwidget.cpp
@@ -126,6 +126,16 @@ ValgrindConfigWidget::ValgrindConfigWidget(ValgrindBaseSettings *settings,
connect(m_ui->numCallers, SIGNAL(valueChanged(int)), m_settings, SLOT(setNumCallers(int)));
connect(m_settings, SIGNAL(numCallersChanged(int)), m_ui->numCallers, SLOT(setValue(int)));
+ connect(m_ui->leakCheckOnFinish, SIGNAL(currentIndexChanged(int)),
+ m_settings, SLOT(setLeakCheckOnFinish(int)));
+ connect(m_settings, SIGNAL(leakCheckOnFinishChanged(int)),
+ m_ui->leakCheckOnFinish, SLOT(setCurrentIndex(int)));
+
+ connect(m_ui->showReachable, SIGNAL(toggled(bool)),
+ m_settings, SLOT(setShowReachable(bool)));
+ connect(m_settings, SIGNAL(showReachableChanged(bool)),
+ m_ui->showReachable, SLOT(setChecked(bool)));
+
connect(m_ui->trackOrigins, SIGNAL(toggled(bool)),
m_settings, SLOT(setTrackOrigins(bool)));
connect(m_settings, SIGNAL(trackOriginsChanged(bool)),
@@ -169,6 +179,8 @@ void ValgrindConfigWidget::updateUi()
m_ui->minimumInclusiveCostRatio->setValue(m_settings->minimumInclusiveCostRatio());
m_ui->visualisationMinimumInclusiveCostRatio->setValue(m_settings->visualisationMinimumInclusiveCostRatio());
m_ui->numCallers->setValue(m_settings->numCallers());
+ m_ui->leakCheckOnFinish->setCurrentIndex(m_settings->leakCheckOnFinish());
+ m_ui->showReachable->setChecked(m_settings->showReachable());
m_ui->trackOrigins->setChecked(m_settings->trackOrigins());
m_model->clear();
foreach (const QString &file, m_settings->suppressionFiles())
diff --git a/src/plugins/valgrind/valgrindconfigwidget.ui b/src/plugins/valgrind/valgrindconfigwidget.ui
index 454f28fc3d0..2c0e989760f 100644
--- a/src/plugins/valgrind/valgrindconfigwidget.ui
+++ b/src/plugins/valgrind/valgrindconfigwidget.ui
@@ -6,8 +6,8 @@
0
0
- 628
- 368
+ 655
+ 364
@@ -259,11 +259,71 @@ With cache simulation, further event counters are enabled:
Memory Analysis Options
-
-
- QFormLayout::ExpandingFieldsGrow
-
+
+ -
+
+
+ Track origins of uninitialized memory
+
+
+ true
+
+
+
+ -
+
+
+ Show reachable and indirectly lost blocks
+
+
+
-
+
+
+ Check for leaks on finish:
+
+
+
+ -
+
+
-
+
+
+ 0
+
+
-
+
+ No
+
+
+ -
+
+ Summary Only
+
+
+ -
+
+ Full
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
Backtrace frame count:
@@ -273,7 +333,37 @@ With cache simulation, further event counters are enabled:
- -
+
-
+
+
-
+
+
+ 5
+
+
+ 50
+
+
+ 12
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
Suppression files:
@@ -283,7 +373,7 @@ With cache simulation, further event counters are enabled:
- -
+
-
-
@@ -334,29 +424,6 @@ With cache simulation, further event counters are enabled:
- -
-
-
- 5
-
-
- 50
-
-
- 12
-
-
-
- -
-
-
- Track origins of uninitialized memory
-
-
- true
-
-
-
diff --git a/src/plugins/valgrind/valgrindsettings.cpp b/src/plugins/valgrind/valgrindsettings.cpp
index e771e11dc79..8a33ce1b264 100644
--- a/src/plugins/valgrind/valgrindsettings.cpp
+++ b/src/plugins/valgrind/valgrindsettings.cpp
@@ -43,6 +43,8 @@
using namespace Analyzer;
const char numCallersC[] = "Analyzer.Valgrind.NumCallers";
+const char leakCheckOnFinishC[] = "Analyzer.Valgrind.LeakCheckOnFinish";
+const char showReachableC[] = "Analyzer.Valgrind.ShowReachable";
const char trackOriginsC[] = "Analyzer.Valgrind.TrackOrigins";
const char selfModifyingCodeDetectionC[] = "Analyzer.Valgrind.SelfModifyingCodeDetection";
const char suppressionFilesC[] = "Analyzer.Valgrind.SupressionFiles";
@@ -95,6 +97,8 @@ void ValgrindBaseSettings::fromMap(const QVariantMap &map)
// Memcheck
setIfPresent(map, QLatin1String(numCallersC), &m_numCallers);
+ setIfPresent(map, QLatin1String(leakCheckOnFinishC), (int*) &m_leakCheckOnFinish);
+ setIfPresent(map, QLatin1String(showReachableC), &m_showReachable);
setIfPresent(map, QLatin1String(trackOriginsC), &m_trackOrigins);
setIfPresent(map, QLatin1String(filterExternalIssuesC), &m_filterExternalIssues);
if (map.contains(QLatin1String(visibleErrorKindsC))) {
@@ -124,6 +128,8 @@ void ValgrindBaseSettings::toMap(QVariantMap &map) const
// Memcheck
map.insert(QLatin1String(numCallersC), m_numCallers);
+ map.insert(QLatin1String(leakCheckOnFinishC), m_leakCheckOnFinish);
+ map.insert(QLatin1String(showReachableC), m_showReachable);
map.insert(QLatin1String(trackOriginsC), m_trackOrigins);
map.insert(QLatin1String(filterExternalIssuesC), m_filterExternalIssues);
QVariantList errorKinds;
@@ -176,6 +182,22 @@ void ValgrindBaseSettings::setNumCallers(int numCallers)
}
}
+void ValgrindBaseSettings::setLeakCheckOnFinish(int leakCheckOnFinish)
+{
+ if (m_leakCheckOnFinish != leakCheckOnFinish) {
+ m_leakCheckOnFinish = (LeakCheckOnFinish) leakCheckOnFinish;
+ emit leakCheckOnFinishChanged(leakCheckOnFinish);
+ }
+}
+
+void ValgrindBaseSettings::setShowReachable(bool showReachable)
+{
+ if (m_showReachable != showReachable) {
+ m_showReachable = showReachable;
+ emit showReachableChanged(showReachable);
+ }
+}
+
void ValgrindBaseSettings::setTrackOrigins(bool trackOrigins)
{
if (m_trackOrigins != trackOrigins) {
@@ -368,6 +390,8 @@ void ValgrindGlobalSettings::readSettings()
// Memcheck
defaults.insert(QLatin1String(numCallersC), 25);
+ defaults.insert(QLatin1String(leakCheckOnFinishC), LeakCheckOnFinishSummaryOnly);
+ defaults.insert(QLatin1String(showReachableC), false);
defaults.insert(QLatin1String(trackOriginsC), true);
defaults.insert(QLatin1String(filterExternalIssuesC), true);
QVariantList defaultErrorKinds;
diff --git a/src/plugins/valgrind/valgrindsettings.h b/src/plugins/valgrind/valgrindsettings.h
index 9dd3b738b48..df03c173f5c 100644
--- a/src/plugins/valgrind/valgrindsettings.h
+++ b/src/plugins/valgrind/valgrindsettings.h
@@ -58,6 +58,12 @@ public:
DetectSmcEverywhereButFile
};
+ enum LeakCheckOnFinish {
+ LeakCheckOnFinishNo,
+ LeakCheckOnFinishSummaryOnly,
+ LeakCheckOnFinishYes
+ };
+
ValgrindBaseSettings() {}
void toMap(QVariantMap &map) const;
@@ -91,6 +97,8 @@ private:
*/
public:
int numCallers() const { return m_numCallers; }
+ LeakCheckOnFinish leakCheckOnFinish() const { return m_leakCheckOnFinish; }
+ bool showReachable() const { return m_showReachable; }
bool trackOrigins() const { return m_trackOrigins; }
bool filterExternalIssues() const { return m_filterExternalIssues; }
QList visibleErrorKinds() const { return m_visibleErrorKinds; }
@@ -101,12 +109,16 @@ public:
public slots:
void setNumCallers(int);
+ void setLeakCheckOnFinish(int);
+ void setShowReachable(bool);
void setTrackOrigins(bool);
void setFilterExternalIssues(bool);
void setVisibleErrorKinds(const QList &);
signals:
void numCallersChanged(int);
+ void leakCheckOnFinishChanged(int);
+ void showReachableChanged(bool);
void trackOriginsChanged(bool);
void filterExternalIssuesChanged(bool);
void visibleErrorKindsChanged(const QList &);
@@ -115,6 +127,8 @@ signals:
protected:
int m_numCallers;
+ LeakCheckOnFinish m_leakCheckOnFinish;
+ bool m_showReachable;
bool m_trackOrigins;
bool m_filterExternalIssues;
QList m_visibleErrorKinds;