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:
Friedemann Kleint
2009-11-09 09:00:59 +01:00
parent 72db7df3a2
commit 5e0e975873

View File

@@ -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;