diff --git a/src/plugins/debugger/gdb/coregdbadapter.cpp b/src/plugins/debugger/gdb/coregdbadapter.cpp index fb31d37f90a..39f2b8187dc 100644 --- a/src/plugins/debugger/gdb/coregdbadapter.cpp +++ b/src/plugins/debugger/gdb/coregdbadapter.cpp @@ -56,12 +56,19 @@ namespace Internal { /////////////////////////////////////////////////////////////////////// GdbCoreEngine::GdbCoreEngine(const DebuggerStartParameters &startParameters) - : GdbEngine(startParameters) + : GdbEngine(startParameters), + m_coreUnpackProcess(0) {} GdbCoreEngine::~GdbCoreEngine() { - if (false && !m_tempCoreName.isEmpty()) { + if (m_coreUnpackProcess) { + m_coreUnpackProcess->blockSignals(true); + m_coreUnpackProcess->terminate(); + m_coreUnpackProcess->deleteLater(); + m_coreUnpackProcess = 0; + } + if (!m_tempCoreName.isEmpty()) { QFile tmpFile(m_tempCoreName); tmpFile.remove(); } @@ -114,32 +121,39 @@ QString GdbCoreEngine::readExecutableNameFromCore(bool *isCore) void GdbCoreEngine::continueSetupEngine() { - if (m_executable.isEmpty()) { + bool isCore = true; + if (m_coreUnpackProcess) { + isCore = m_coreUnpackProcess->exitCode() == 0; + m_coreUnpackProcess->deleteLater(); + m_coreUnpackProcess = 0; + } + if (isCore && m_executable.isEmpty()) { // Read executable from core. - bool isCore = false; + isCore = false; m_executable = readExecutableNameFromCore(&isCore); - if (!isCore) { - showMessageBox(QMessageBox::Warning, - tr("Error Loading Core File"), - tr("The specified file does not appear to be a core file.")); - notifyEngineSetupFailed(); - return; - } - - // Strip off command line arguments. FIXME: make robust. - int idx = m_executable.indexOf(QLatin1Char(' ')); - if (idx >= 0) - m_executable.truncate(idx); - if (m_executable.isEmpty()) { - showMessageBox(QMessageBox::Warning, - tr("Error Loading Symbols"), - tr("No executable to load symbols from specified core.")); - notifyEngineSetupFailed(); - return; + if (isCore) { + // Strip off command line arguments. FIXME: make robust. + int idx = m_executable.indexOf(QLatin1Char(' ')); + if (idx >= 0) + m_executable.truncate(idx); + if (m_executable.isEmpty()) { + showMessageBox(QMessageBox::Warning, + tr("Error Loading Symbols"), + tr("No executable to load symbols from specified core.")); + notifyEngineSetupFailed(); + return; + } } } - startGdb(); + if (isCore) + startGdb(); + else { + showMessageBox(QMessageBox::Warning, + tr("Error Loading Core File"), + tr("The specified file does not appear to be a core file.")); + notifyEngineSetupFailed(); + } } void GdbCoreEngine::setupInferior() @@ -233,12 +247,12 @@ void GdbCoreEngine::unpackCoreIfNeeded() m_tempCoreName = tmp.fileName(); } - QProcess *process = new QProcess(this); - process->setWorkingDirectory(QDir::tempPath()); QStringList arguments; arguments << QLatin1String("-o") << m_tempCoreName << QLatin1String("-x") << m_coreName; - process->start(QLatin1String("/usr/bin/lzop"), arguments); - connect(process, SIGNAL(finished(int)), SLOT(continueSetupEngine())); + m_coreUnpackProcess = new QProcess(this); + m_coreUnpackProcess->setWorkingDirectory(QDir::tempPath()); + m_coreUnpackProcess->start(QLatin1String("lzop"), arguments); + connect(m_coreUnpackProcess, SIGNAL(finished(int)), SLOT(continueSetupEngine())); } QString GdbCoreEngine::coreFileName() const diff --git a/src/plugins/debugger/gdb/coregdbadapter.h b/src/plugins/debugger/gdb/coregdbadapter.h index c1b12c12d87..966a7992a4c 100644 --- a/src/plugins/debugger/gdb/coregdbadapter.h +++ b/src/plugins/debugger/gdb/coregdbadapter.h @@ -74,6 +74,7 @@ private: QString m_coreName; LocalGdbProcess m_gdbProc; QString m_tempCoreName; + QProcess *m_coreUnpackProcess; }; } // namespace Internal