Valgrind: Add gui option "Detect self-modifying code"

Setting this option to e.g. "Everywhere Except in File-backend Mappings"
allows to 'valgrind' Qt Creator itself.

Without that option the valgrind process will die if certain code paths
are executed.

Change-Id: I8888456d324a25ce092f0b0128407adf2159f496
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
Nikolai Kosjar
2013-09-06 16:33:48 +02:00
committed by hjk
parent 00de61a79c
commit 548319c523
6 changed files with 213 additions and 105 deletions

View File

@@ -44,6 +44,7 @@ using namespace Analyzer;
const char numCallersC[] = "Analyzer.Valgrind.NumCallers";
const char trackOriginsC[] = "Analyzer.Valgrind.TrackOrigins";
const char selfModifyingCodeDetectionC[] = "Analyzer.Valgrind.SelfModifyingCodeDetection";
const char suppressionFilesC[] = "Analyzer.Valgrind.SupressionFiles";
const char removedSuppressionFilesC[] = "Analyzer.Valgrind.RemovedSuppressionFiles";
const char addedSuppressionFilesC[] = "Analyzer.Valgrind.AddedSuppressionFiles";
@@ -89,6 +90,8 @@ void ValgrindBaseSettings::fromMap(const QVariantMap &map)
{
// General
setIfPresent(map, QLatin1String(valgrindExeC), &m_valgrindExecutable);
setIfPresent(map, QLatin1String(selfModifyingCodeDetectionC),
(int*) &m_selfModifyingCodeDetection);
// Memcheck
setIfPresent(map, QLatin1String(numCallersC), &m_numCallers);
@@ -117,6 +120,7 @@ void ValgrindBaseSettings::toMap(QVariantMap &map) const
{
// General
map.insert(QLatin1String(valgrindExeC), m_valgrindExecutable);
map.insert(QLatin1String(selfModifyingCodeDetectionC), m_selfModifyingCodeDetection);
// Memcheck
map.insert(QLatin1String(numCallersC), m_numCallers);
@@ -146,11 +150,24 @@ void ValgrindBaseSettings::setValgrindExecutable(const QString &valgrindExecutab
}
}
void ValgrindBaseSettings::setSelfModifyingCodeDetection(int smcDetection)
{
if (m_selfModifyingCodeDetection != smcDetection) {
m_selfModifyingCodeDetection = (SelfModifyingCodeDetection) smcDetection;
emit selfModifyingCodeDetectionChanged(smcDetection);
}
}
QString ValgrindBaseSettings::valgrindExecutable() const
{
return m_valgrindExecutable;
}
ValgrindBaseSettings::SelfModifyingCodeDetection ValgrindBaseSettings::selfModifyingCodeDetection() const
{
return m_selfModifyingCodeDetection;
}
void ValgrindBaseSettings::setNumCallers(int numCallers)
{
if (m_numCallers != numCallers) {
@@ -347,6 +364,7 @@ void ValgrindGlobalSettings::readSettings()
// General
defaults.insert(QLatin1String(valgrindExeC), QLatin1String("valgrind"));
defaults.insert(QLatin1String(selfModifyingCodeDetectionC), DetectSmcStackOnly);
// Memcheck
defaults.insert(QLatin1String(numCallersC), 25);