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;