forked from qt-creator/qt-creator
Debugger/Windows: Register debugger properly if there is no default.
Some systems do not have a default debugger registered. Do not fail on reading the missing key and disable "Default Debugger" in that case. Initial-patch-by: Robert Loehning <robert.loehning@nokia.com> Reviewed-by: Robert Loehning <robert.loehning@nokia.com>
This commit is contained in:
@@ -363,19 +363,25 @@ bool startCreatorAsDebugger(QString *errorMessage)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool readDefaultDebugger(QString *defaultDebugger,
|
||||||
|
QString *errorMessage)
|
||||||
|
{
|
||||||
|
bool success = false;
|
||||||
|
HKEY handle;
|
||||||
|
if (openRegistryKey(HKEY_LOCAL_MACHINE, optIsWow ? debuggerWow32RegistryKeyC : debuggerRegistryKeyC,
|
||||||
|
false, &handle, errorMessage)) {
|
||||||
|
success = registryReadStringKey(handle, debuggerRegistryDefaultValueNameC,
|
||||||
|
defaultDebugger, errorMessage);
|
||||||
|
RegCloseKey(handle);
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
bool startDefaultDebugger(QString *errorMessage)
|
bool startDefaultDebugger(QString *errorMessage)
|
||||||
{
|
{
|
||||||
// Read out default value
|
|
||||||
HKEY handle;
|
|
||||||
if (!openRegistryKey(HKEY_LOCAL_MACHINE, optIsWow ? debuggerWow32RegistryKeyC : debuggerRegistryKeyC,
|
|
||||||
false, &handle, errorMessage))
|
|
||||||
return false;
|
|
||||||
QString defaultDebugger;
|
QString defaultDebugger;
|
||||||
if (!registryReadStringKey(handle, debuggerRegistryDefaultValueNameC, &defaultDebugger, errorMessage)) {
|
if (!readDefaultDebugger(&defaultDebugger, errorMessage))
|
||||||
RegCloseKey(handle);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
RegCloseKey(handle);
|
|
||||||
// binary, replace placeholders by pid/event id
|
// binary, replace placeholders by pid/event id
|
||||||
if (debug)
|
if (debug)
|
||||||
qDebug() << "Default" << defaultDebugger;
|
qDebug() << "Default" << defaultDebugger;
|
||||||
@@ -401,10 +407,13 @@ bool startDefaultDebugger(QString *errorMessage)
|
|||||||
|
|
||||||
bool chooseDebugger(QString *errorMessage)
|
bool chooseDebugger(QString *errorMessage)
|
||||||
{
|
{
|
||||||
|
QString defaultDebugger;
|
||||||
const QString msg = QString::fromLatin1("The application \"%1\" (process id %2) crashed. Would you like to debug it?").arg(getProcessBaseName(argProcessId)).arg(argProcessId);
|
const QString msg = QString::fromLatin1("The application \"%1\" (process id %2) crashed. Would you like to debug it?").arg(getProcessBaseName(argProcessId)).arg(argProcessId);
|
||||||
QMessageBox msgBox(QMessageBox::Information, QLatin1String(titleC), msg, QMessageBox::Cancel);
|
QMessageBox msgBox(QMessageBox::Information, QLatin1String(titleC), msg, QMessageBox::Cancel);
|
||||||
QPushButton *creatorButton = msgBox.addButton(QLatin1String("Debug with Qt Creator"), QMessageBox::AcceptRole);
|
QPushButton *creatorButton = msgBox.addButton(QLatin1String("Debug with Qt Creator"), QMessageBox::AcceptRole);
|
||||||
QPushButton *defaultButton = msgBox.addButton(QLatin1String("Debug with default debugger"), QMessageBox::AcceptRole);
|
QPushButton *defaultButton = msgBox.addButton(QLatin1String("Debug with default debugger"), QMessageBox::AcceptRole);
|
||||||
|
defaultButton->setEnabled(readDefaultDebugger(&defaultDebugger, errorMessage)
|
||||||
|
&& !defaultDebugger.isEmpty());
|
||||||
msgBox.exec();
|
msgBox.exec();
|
||||||
if (msgBox.clickedButton() == creatorButton) {
|
if (msgBox.clickedButton() == creatorButton) {
|
||||||
// Just in case, default to standard
|
// Just in case, default to standard
|
||||||
@@ -444,12 +453,12 @@ static bool registerDebuggerKey(const WCHAR *key,
|
|||||||
do {
|
do {
|
||||||
if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, errorMessage))
|
if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, errorMessage))
|
||||||
break;
|
break;
|
||||||
|
// Save old key, which might be missing
|
||||||
QString oldDebugger;
|
QString oldDebugger;
|
||||||
if (!registryReadStringKey(handle, debuggerRegistryValueNameC, &oldDebugger, errorMessage))
|
registryReadStringKey(handle, debuggerRegistryValueNameC, &oldDebugger, errorMessage);
|
||||||
break;
|
|
||||||
if (oldDebugger.contains(QLatin1String(applicationFileC), Qt::CaseInsensitive)) {
|
if (oldDebugger.contains(QLatin1String(applicationFileC), Qt::CaseInsensitive)) {
|
||||||
*errorMessage = QLatin1String("The program is already registered as post mortem debugger.");
|
*errorMessage = QLatin1String("The program is already registered as post mortem debugger.");
|
||||||
return false;
|
break;
|
||||||
}
|
}
|
||||||
if (!registryWriteStringKey(handle, debuggerRegistryDefaultValueNameC, oldDebugger, errorMessage))
|
if (!registryWriteStringKey(handle, debuggerRegistryDefaultValueNameC, oldDebugger, errorMessage))
|
||||||
break;
|
break;
|
||||||
@@ -483,11 +492,24 @@ static bool unregisterDebuggerKey(const WCHAR *key, QString *errorMessage)
|
|||||||
do {
|
do {
|
||||||
if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, errorMessage))
|
if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, errorMessage))
|
||||||
break;
|
break;
|
||||||
|
QString debugger;
|
||||||
|
registryReadStringKey(handle, debuggerRegistryValueNameC, &debugger, errorMessage);
|
||||||
|
if (!(debugger.isEmpty()
|
||||||
|
|| debugger.contains(QLatin1String(applicationFileC), Qt::CaseInsensitive))) {
|
||||||
|
*errorMessage = QLatin1String("The program is not registered as post mortem debugger.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
QString oldDebugger;
|
QString oldDebugger;
|
||||||
if (!registryReadStringKey(handle, debuggerRegistryDefaultValueNameC, &oldDebugger, errorMessage))
|
if (!registryReadStringKey(handle, debuggerRegistryDefaultValueNameC, &oldDebugger, errorMessage))
|
||||||
break;
|
break;
|
||||||
if (!registryWriteStringKey(handle, debuggerRegistryValueNameC, oldDebugger, errorMessage))
|
// Re-register old debugger or delete key if it was empty.
|
||||||
break;
|
if (oldDebugger.isEmpty()) {
|
||||||
|
if (!registryDeleteValue(handle, debuggerRegistryValueNameC, errorMessage))
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if (!registryWriteStringKey(handle, debuggerRegistryValueNameC, oldDebugger, errorMessage))
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (!registryDeleteValue(handle, debuggerRegistryDefaultValueNameC, errorMessage))
|
if (!registryDeleteValue(handle, debuggerRegistryDefaultValueNameC, errorMessage))
|
||||||
break;
|
break;
|
||||||
success = true;
|
success = true;
|
||||||
|
Reference in New Issue
Block a user