diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-04-25 12:19:48 +0200 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2014-05-08 15:28:06 +0200 |
commit | aa52cfa0e6745d517b11c85a013a35f9712257f5 (patch) | |
tree | 9b340ce1af18460f566858a90524b327bddaf46a /src/plugins/valgrind/memcheck/memcheckrunner.cpp | |
parent | 9c24a673de5b1c85c319e0b3ed776cbc014f25cd (diff) | |
download | qt-creator-aa52cfa0e6745d517b11c85a013a35f9712257f5.tar.gz |
Valgrind: Remove dialog asking for IP address.
When running the memcheck tool remotely, it sends its data via a TCP
socket to the development host, so it needs to know that machine's IP
address. The current code gathers all local network addresses and makes
the user choose one of them. However, we can get that information from
the SSH connection, so no user interaction is required.
Change-Id: Ia61decddd5fa1e285ca143605d944d6d9275b3e4
Reviewed-by: hjk <hjk121@nokiamail.com>
Diffstat (limited to 'src/plugins/valgrind/memcheck/memcheckrunner.cpp')
-rw-r--r-- | src/plugins/valgrind/memcheck/memcheckrunner.cpp | 136 |
1 files changed, 46 insertions, 90 deletions
diff --git a/src/plugins/valgrind/memcheck/memcheckrunner.cpp b/src/plugins/valgrind/memcheck/memcheckrunner.cpp index e0ab359ce9..0f88f984f1 100644 --- a/src/plugins/valgrind/memcheck/memcheckrunner.cpp +++ b/src/plugins/valgrind/memcheck/memcheckrunner.cpp @@ -33,6 +33,7 @@ #include "../xmlprotocol/error.h" #include "../xmlprotocol/status.h" #include "../xmlprotocol/threadedparser.h" +#include "../valgrindprocess.h" #include <utils/qtcassert.h> @@ -96,98 +97,11 @@ bool MemcheckRunner::start() { QTC_ASSERT(d->parser, return false); - QString ip; - QHostAddress hostAddr; - + // The remote case is handled in localHostAddressRetrieved(). if (startMode() == Analyzer::StartLocal) { - ip = QLatin1String("127.0.0.1"); - hostAddr = QHostAddress(QHostAddress::LocalHost); - } - - if (startMode() == Analyzer::StartRemote) { - - QList<QHostAddress> possibleHostAddresses; - //NOTE: ::allAddresses does not seem to work for usb interfaces... - foreach (const QNetworkInterface &iface, QNetworkInterface::allInterfaces()) { - foreach (const QNetworkAddressEntry &entry, iface.addressEntries()) { - const QHostAddress addr = entry.ip(); - if (addr.toString() != QLatin1String("127.0.0.1") - && addr.toString() != QLatin1String("0:0:0:0:0:0:0:1")) - { - possibleHostAddresses << addr; - break; - } - } - } - - if (possibleHostAddresses.isEmpty()) { - emit processErrorReceived(tr("No network interface found for remote analysis."), - QProcess::FailedToStart); - return false; - } else if (possibleHostAddresses.size() > 1) { - QDialog dlg; - dlg.setWindowTitle(tr("Select Network Interface")); - QVBoxLayout *layout = new QVBoxLayout; - QLabel *description = new QLabel; - description->setWordWrap(true); - description->setText(tr("More than one network interface was found on your machine. Please select the one you want to use for remote analysis.")); - layout->addWidget(description); - QListWidget *list = new QListWidget; - foreach (const QHostAddress &address, possibleHostAddresses) - list->addItem(address.toString()); - - list->setSelectionMode(QAbstractItemView::SingleSelection); - list->setCurrentRow(0); - layout->addWidget(list); - - QDialogButtonBox *buttons = new QDialogButtonBox; - buttons->addButton(QDialogButtonBox::Ok); - buttons->addButton(QDialogButtonBox::Cancel); - connect(buttons, SIGNAL(accepted()), - &dlg, SLOT(accept())); - connect(buttons, SIGNAL(rejected()), - &dlg, SLOT(reject())); - layout->addWidget(buttons); - - dlg.setLayout(layout); - if (dlg.exec() != QDialog::Accepted) { - emit processErrorReceived(tr("No network interface was chosen for remote analysis."), QProcess::FailedToStart); - return false; - } - - QTC_ASSERT(list->currentRow() >= 0, return false); - QTC_ASSERT(list->currentRow() < possibleHostAddresses.size(), return false); - hostAddr = possibleHostAddresses.at(list->currentRow()); - } else { - hostAddr = possibleHostAddresses.first(); - } - - ip = hostAddr.toString(); - QTC_ASSERT(!ip.isEmpty(), return false); - hostAddr = QHostAddress(ip); + startServers(QHostAddress(QHostAddress::LocalHost)); + setValgrindArguments(memcheckLogArguments() + valgrindArguments()); } - - bool check = d->xmlServer.listen(hostAddr); - if (!check) emit processErrorReceived( tr("XmlServer on %1:").arg(ip) + QLatin1Char(' ') + d->xmlServer.errorString(), QProcess::FailedToStart ); - QTC_ASSERT(check, return false); - d->xmlServer.setMaxPendingConnections(1); - const quint16 xmlPortNumber = d->xmlServer.serverPort(); - connect(&d->xmlServer, SIGNAL(newConnection()), SLOT(xmlSocketConnected())); - - check = d->logServer.listen(hostAddr); - if (!check) emit processErrorReceived( tr("LogServer on %1:").arg(ip) + QLatin1Char(' ') + d->logServer.errorString(), QProcess::FailedToStart ); - QTC_ASSERT(check, return false); - d->logServer.setMaxPendingConnections(1); - const quint16 logPortNumber = d->logServer.serverPort(); - connect(&d->logServer, SIGNAL(newConnection()), SLOT(logSocketConnected())); - - QStringList memcheckLogArguments; - memcheckLogArguments << QLatin1String("--xml=yes") - << QString::fromLatin1("--xml-socket=%1:%2").arg(ip).arg(xmlPortNumber) - << QLatin1String("--child-silent-after-fork=yes") - << QString::fromLatin1("--log-socket=%1:%2").arg(ip).arg(logPortNumber); - setValgrindArguments(memcheckLogArguments + valgrindArguments()); - return ValgrindRunner::start(); } @@ -214,5 +128,47 @@ void MemcheckRunner::readLogSocket() emit logMessageReceived(d->logSocket->readAll()); } +// Note: The callers of this function cannot handle errors, so they will ignore the return value. +// We still provide it in case the surrounding infrastructure will improve. +bool MemcheckRunner::startServers(const QHostAddress &localHostAddress) +{ + bool check = d->xmlServer.listen(localHostAddress); + const QString ip = localHostAddress.toString(); + if (!check) { + emit processErrorReceived( tr("XmlServer on %1:").arg(ip) + QLatin1Char(' ') + + d->xmlServer.errorString(), QProcess::FailedToStart ); + return false; + } + d->xmlServer.setMaxPendingConnections(1); + connect(&d->xmlServer, SIGNAL(newConnection()), SLOT(xmlSocketConnected())); + check = d->logServer.listen(localHostAddress); + if (!check) { + emit processErrorReceived( tr("LogServer on %1:").arg(ip) + QLatin1Char(' ') + + d->logServer.errorString(), QProcess::FailedToStart ); + return false; + } + d->logServer.setMaxPendingConnections(1); + connect(&d->logServer, SIGNAL(newConnection()), SLOT(logSocketConnected())); + return true; +} + +QStringList MemcheckRunner::memcheckLogArguments() const +{ + return QStringList() + << QLatin1String("--xml=yes") + << QString::fromLatin1("--xml-socket=%1:%2") + .arg(d->xmlServer.serverAddress().toString()).arg(d->xmlServer.serverPort()) + << QLatin1String("--child-silent-after-fork=yes") + << QString::fromLatin1("--log-socket=%1:%2") + .arg(d->logServer.serverAddress().toString()).arg(d->logServer.serverPort()); +} + +void MemcheckRunner::localHostAddressRetrieved(const QHostAddress &localHostAddress) +{ + startServers(localHostAddress); + setValgrindArguments(memcheckLogArguments() + valgrindArguments()); + valgrindProcess()->setValgrindArguments(fullValgrindArguments()); +} + } // namespace Memcheck } // namespace Valgrind |