diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index 0cbb08ea1d1deb2e8cff75b07ea4231033c6149a..f4922e4ab2a98f52865f80465c4e2b59cd0c5972 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -399,6 +399,12 @@ DebuggerSettings *DebuggerSettings::instance() item->setText(tr("Execute line")); instance->insertItem(ExecuteCommand, item); + item = new SavedAction(instance); + item->setSettingsKey(debugModeGroup, QLatin1String("WatchdogTimeout")); + item->setDefaultValue(20); + instance->insertItem(GdbWatchdogTimeout, item); + + return instance; } diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index 6ea017350b661361b57f93c4c55fd13bd6789ac4..c43d7caae41a789791b9785f3c76eabf3f73d615 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -100,6 +100,7 @@ enum DebuggerActionCode GdbEnvironment, GdbScriptFile, ExecuteCommand, + GdbWatchdogTimeout, // Stack MaximalStackDepth, diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 0684b11d5ac2832d3f698e4244946e07892d5005..00bbd650247893b01a7d07037dea4d6b00e193be 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -362,6 +362,7 @@ QWidget *CommonOptionsPage::createPage(QWidget *parent) m_ui.checkBoxEnableReverseDebugging); m_group.insert(theDebuggerAction(MaximalStackDepth), m_ui.spinBoxMaximalStackDepth); + m_group.insert(theDebuggerAction(GdbWatchdogTimeout), 0); m_group.insert(theDebuggerAction(ShowStdNamespace), 0); m_group.insert(theDebuggerAction(ShowQtNamespace), 0); m_group.insert(theDebuggerAction(LogTimeStamps), 0); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index e471d4d9791c57cd9e88a1e90b91d5027f617328..f03b07a7004efbbe25035846a39d9389e6ec5287 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -194,7 +194,8 @@ GdbEngine::GdbEngine(DebuggerManager *manager) : m_commandTimer = new QTimer(this); m_commandTimer->setSingleShot(true); - m_commandTimer->setInterval(COMMAND_TIMEOUT); + m_commandTimer->setInterval( + 1000 * qMin(20, theDebuggerAction(GdbWatchdogTimeout)->value().toInt())); connect(m_commandTimer, SIGNAL(timeout()), SLOT(commandTimeout())); // Needs no resetting in initializeVariables() diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 731791d677f02a6a18f0850492cb79a76687dee6..92937913479b47779d7279247c0071e5edb5b380 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -235,7 +235,6 @@ private: ////////// Gdb Command Management ////////// QHash<int, GdbCommand> m_cookieForToken; QTimer *m_commandTimer; - enum { COMMAND_TIMEOUT = 20000 }; QByteArray m_pendingConsoleStreamOutput; QByteArray m_pendingLogStreamOutput; diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp index d209f6b12cdce5da089cc5dd7d9d2384b210cae2..67fe0637e2be5fb6fa292c7d79f99e001fe1bced 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.cpp +++ b/src/plugins/debugger/gdb/gdboptionspage.cpp @@ -51,6 +51,9 @@ QWidget *GdbOptionsPage::createPage(QWidget *parent) m_ui.environmentEdit); m_group.insert(theDebuggerAction(UsePreciseBreakpoints), m_ui.checkBoxUsePreciseBreakpoints); + m_group.insert(theDebuggerAction(GdbWatchdogTimeout), + m_ui.spinBoxGdbWatchdogTimeout); + #if 1 m_ui.groupBoxPluginDebugging->hide(); diff --git a/src/plugins/debugger/gdb/gdboptionspage.ui b/src/plugins/debugger/gdb/gdboptionspage.ui index a7c90a2755771036e242ee927f9fd9e052098971..3a46c86fd495a1c0d19e73617b489c1660a3ad28 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.ui +++ b/src/plugins/debugger/gdb/gdboptionspage.ui @@ -2,6 +2,14 @@ <ui version="4.0"> <class>GdbOptionsPage</class> <widget class="QWidget" name="GdbOptionsPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>397</width> + <height>322</height> + </rect> + </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="groupBoxLocations"> @@ -29,7 +37,7 @@ </widget> </item> <item row="0" column="1"> - <widget class="Utils::PathChooser" name="gdbLocationChooser"/> + <widget class="Utils::PathChooser" name="gdbLocationChooser" native="true"/> </item> <item row="1" column="0"> <widget class="QLabel" name="labelEnvironment"> @@ -55,19 +63,55 @@ </widget> </item> <item row="2" column="1"> - <widget class="Utils::PathChooser" name="scriptFileChooser"/> + <widget class="Utils::PathChooser" name="scriptFileChooser" native="true"/> </item> <item row="3" column="0" colspan="2"> <widget class="QCheckBox" name="checkBoxUsePreciseBreakpoints"> - <property name="text"> - <string>Use full path information to set breakpoints</string> - </property> <property name="toolTip"> <string>When this option is checked, the debugger plugin attempts to extract full path information for all source files from gdb. This is a slow process but enables setting breakpoints in files with the same file name in different directories.</string> </property> + <property name="text"> + <string>Use full path information to set breakpoints</string> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="labelGdbWatchdogTimeout"> + <property name="text"> + <string>Gdb timeout:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QSpinBox" name="spinBoxGdbWatchdogTimeout"> + <property name="toolTip"> + <string>This is the number of second Qt Creator will wait before +it terminates non-reacting gdb process. The default value of 20 seconds +should be sufficient for most applications, but there are situations when +loading big libraries or listing source files takes much longer than that +on slow machines. In this case the value should be increased.</string> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="specialValueText"> + <string><unlimited></string> + </property> + <property name="minimum"> + <number>20</number> + </property> + <property name="maximum"> + <number>1000000</number> + </property> + <property name="singleStep"> + <number>20</number> + </property> + <property name="value"> + <number>20</number> + </property> </widget> </item> </layout>