forked from qt-creator/qt-creator
Debugger: Use Symbol server nagging code in both CDB engines.
This commit is contained in:
@@ -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."));
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user