Debugger: Use Symbol server nagging code in both CDB engines.

This commit is contained in:
Friedemann Kleint
2010-11-18 16:22:41 +01:00
parent abd7ab2cd5
commit 727b8c3c31
5 changed files with 57 additions and 38 deletions

View File

@@ -352,42 +352,6 @@ void CdbEnginePrivate::checkVersion()
} }
} }
void CdbEngine::startupChecks()
{
// Check symbol server unless the user has an external/internal setup
if (!qgetenv("_NT_SYMBOL_PATH").isEmpty()
|| CdbOptions::indexOfSymbolServerPath(m_d->m_options->symbolPaths) != -1)
return;
// Prompt to use Symbol server unless the user checked "No nagging".
Core::ICore *core = Core::ICore::instance();
const QString nagSymbolServerKey = CdbOptions::settingsGroup() + QLatin1String("/NoPromptSymbolServer");
bool noFurtherNagging = core->settings()->value(nagSymbolServerKey, false).toBool();
if (noFurtherNagging)
return;
const QString symServUrl = QLatin1String("http://support.microsoft.com/kb/311503");
const QString msg = tr("<html><head/><body><p>The debugger is not configured to use the public "
"<a href=\"%1\">Microsoft Symbol Server</a>. This is recommended "
"for retrieval of the symbols of the operating system libraries.</p>"
"<p><i>Note:</i> A fast internet connection is required for this to work smoothly. Also, a delay "
"might occur when connecting for the first time.</p>"
"<p>Would you like to set it up?</p></br>"
"</body></html>").arg(symServUrl);
const QDialogButtonBox::StandardButton answer =
Utils::CheckableMessageBox::question(core->mainWindow(), tr("Symbol Server"), msg,
tr("Do not ask again"), &noFurtherNagging);
core->settings()->setValue(nagSymbolServerKey, noFurtherNagging);
if (answer == QDialogButtonBox::No)
return;
// Prompt for path and add it. Synchronize QSetting and debugger.
const QString cacheDir = CdbSymbolPathListEditor::promptCacheDirectory(core->mainWindow());
if (cacheDir.isEmpty())
return;
m_d->m_options->symbolPaths.push_back(CdbOptions::symbolServerPath(cacheDir));
m_d->m_options->toSettings(core->settings());
syncDebuggerPaths();
}
void CdbEngine::setupEngine() void CdbEngine::setupEngine()
{ {
QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
@@ -395,7 +359,12 @@ void CdbEngine::setupEngine()
if (debugCDBExecution) if (debugCDBExecution)
qDebug("setupEngine"); qDebug("setupEngine");
CdbCore::BreakPoint::clearNormalizeFileNameCache(); CdbCore::BreakPoint::clearNormalizeFileNameCache();
startupChecks(); // Nag to add symbol server
if (CdbSymbolPathListEditor::promptToAddSymbolServer(CdbOptions::settingsGroup(),
&(m_d->m_options->symbolPaths))) {
m_d->m_options->toSettings(Core::ICore::instance()->settings());
syncDebuggerPaths();
}
m_d->checkVersion(); m_d->checkVersion();
if (m_d->m_hDebuggeeProcess) { if (m_d->m_hDebuggeeProcess) {
warning(QLatin1String("Internal error: Attempt to start debugger while another process is being debugged.")); warning(QLatin1String("Internal error: Attempt to start debugger while another process is being debugged."));

View File

@@ -109,7 +109,6 @@ private slots:
void warning(const QString &w); void warning(const QString &w);
private: private:
void startupChecks();
inline bool startAttachDebugger(qint64 pid, DebuggerStartMode sm, QString *errorMessage); inline bool startAttachDebugger(qint64 pid, DebuggerStartMode sm, QString *errorMessage);
void processTerminated(unsigned long exitCode); void processTerminated(unsigned long exitCode);
void evaluateWatcher(WatchData *wd); void evaluateWatcher(WatchData *wd);

View File

@@ -44,6 +44,9 @@
#include "cdbparsehelpers.h" #include "cdbparsehelpers.h"
#include "watchutils.h" #include "watchutils.h"
#include "gdb/gdbmi.h" #include "gdb/gdbmi.h"
#include "shared/cdbsymbolpathlisteditor.h"
#include <coreplugin/icore.h>
#include <utils/winutils.h> #include <utils/winutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -316,6 +319,11 @@ void CdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEd
void CdbEngine::setupEngine() void CdbEngine::setupEngine()
{ {
// Nag to add symbol server
if (Debugger::Internal::CdbSymbolPathListEditor::promptToAddSymbolServer(CdbOptions::settingsGroup(),
&(m_options->symbolPaths)))
m_options->toSettings(Core::ICore::instance()->settings());
QString errorMessage; QString errorMessage;
if (!doSetupEngine(&errorMessage)) { // Start engine which will run until initial breakpoint if (!doSetupEngine(&errorMessage)) { // Start engine which will run until initial breakpoint
showMessage(errorMessage, LogError); showMessage(errorMessage, LogError);

View File

@@ -29,7 +29,10 @@
#include "cdbsymbolpathlisteditor.h" #include "cdbsymbolpathlisteditor.h"
#include <coreplugin/icore.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/checkablemessagebox.h>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QDebug> #include <QtCore/QDebug>
@@ -39,6 +42,7 @@
#include <QtGui/QVBoxLayout> #include <QtGui/QVBoxLayout>
#include <QtGui/QFormLayout> #include <QtGui/QFormLayout>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QtGui/QMainWindow>
namespace Debugger { namespace Debugger {
namespace Internal { namespace Internal {
@@ -163,5 +167,41 @@ int CdbSymbolPathListEditor::indexOfSymbolServerPath(const QStringList &paths, Q
return -1; return -1;
} }
bool CdbSymbolPathListEditor::promptToAddSymbolServer(const QString &settingsGroup, QStringList *symbolPaths)
{
// Check symbol server unless the user has an external/internal setup
if (!qgetenv("_NT_SYMBOL_PATH").isEmpty()
|| CdbSymbolPathListEditor::indexOfSymbolServerPath(*symbolPaths) != -1)
return false;
// Prompt to use Symbol server unless the user checked "No nagging".
Core::ICore *core = Core::ICore::instance();
const QString nagSymbolServerKey = settingsGroup + QLatin1String("/NoPromptSymbolServer");
bool noFurtherNagging = core->settings()->value(nagSymbolServerKey, false).toBool();
if (noFurtherNagging)
return false;
const QString symServUrl = QLatin1String("http://support.microsoft.com/kb/311503");
const QString msg = tr("<html><head/><body><p>The debugger is not configured to use the public "
"<a href=\"%1\">Microsoft Symbol Server</a>. This is recommended "
"for retrieval of the symbols of the operating system libraries.</p>"
"<p><i>Note:</i> A fast internet connection is required for this to work smoothly. Also, a delay "
"might occur when connecting for the first time.</p>"
"<p>Would you like to set it up?</p></br>"
"</body></html>").arg(symServUrl);
const QDialogButtonBox::StandardButton answer =
Utils::CheckableMessageBox::question(core->mainWindow(), tr("Symbol Server"), msg,
tr("Do not ask again"), &noFurtherNagging);
core->settings()->setValue(nagSymbolServerKey, noFurtherNagging);
if (answer == QDialogButtonBox::No)
return false;
// Prompt for path and add it. Synchronize QSetting and debugger.
const QString cacheDir = CdbSymbolPathListEditor::promptCacheDirectory(core->mainWindow());
if (cacheDir.isEmpty())
return false;
symbolPaths->push_back(CdbSymbolPathListEditor::symbolServerPath(cacheDir));
return true;
}
} // namespace Internal } // namespace Internal
} // namespace Debugger } // namespace Debugger

View File

@@ -86,6 +86,9 @@ public:
// Check for symbol server in list of paths. // Check for symbol server in list of paths.
static int indexOfSymbolServerPath(const QStringList &paths, QString *cacheDir = 0); static int indexOfSymbolServerPath(const QStringList &paths, QString *cacheDir = 0);
// Nag user to add a symbol server to the path list on debugger startup.
static bool promptToAddSymbolServer(const QString &settingsGroup, QStringList *symbolPaths);
private slots: private slots:
void addSymbolServer(); void addSymbolServer();
}; };