diff --git a/src/libs/utils/savedaction.h b/src/libs/utils/savedaction.h
index ab92a4ad80e..53eaa047c81 100644
--- a/src/libs/utils/savedaction.h
+++ b/src/libs/utils/savedaction.h
@@ -93,6 +93,8 @@ private:
Q_SLOT void lineEditEditingFinished();
Q_SLOT void pathChooserEditingFinished();
Q_SLOT void actionTriggered(bool);
+ Q_SLOT void spinBoxValueChanged(int);
+ Q_SLOT void spinBoxValueChanged(QString);
QVariant m_value;
QVariant m_defaultValue;
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index f93819c6e9a..b8bc4dad5a1 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -250,16 +250,16 @@ DebuggerSettings *theDebuggerSettings()
// Settings
//
item = new SavedAction(instance);
- instance->insertItem(GdbLocation, item);
item->setSettingsKey("DebugMode", "Location");
+ instance->insertItem(GdbLocation, item);
item = new SavedAction(instance);
- instance->insertItem(GdbEnvironment, item);
item->setSettingsKey("DebugMode", "Environment");
+ instance->insertItem(GdbEnvironment, item);
item = new SavedAction(instance);
- instance->insertItem(GdbScriptFile, item);
item->setSettingsKey("DebugMode", "ScriptFile");
+ instance->insertItem(GdbScriptFile, item);
item = new SavedAction(instance);
item->setSettingsKey("DebugMode", "AutoQuit");
@@ -268,43 +268,48 @@ DebuggerSettings *theDebuggerSettings()
instance->insertItem(AutoQuit, item);
item = new SavedAction(instance);
- instance->insertItem(UseToolTips, item);
item->setSettingsKey("DebugMode", "UseToolTips");
item->setText(QObject::tr("Use tooltips when debugging"));
item->setCheckable(true);
+ instance->insertItem(UseToolTips, item);
item = new SavedAction(instance);
- instance->insertItem(TerminalApplication, item);
item->setDefaultValue("xterm");
item->setSettingsKey("DebugMode", "Terminal");
+ instance->insertItem(TerminalApplication, item);
item = new SavedAction(instance);
- instance->insertItem(ListSourceFiles, item);
item->setSettingsKey("DebugMode", "ListSourceFiles");
item->setText(QObject::tr("List source files"));
item->setCheckable(true);
+ instance->insertItem(ListSourceFiles, item);
item = new SavedAction(instance);
- instance->insertItem(SkipKnownFrames, item);
item->setSettingsKey("DebugMode", "SkipKnownFrames");
item->setText(QObject::tr("Skip known frames"));
item->setCheckable(true);
+ instance->insertItem(SkipKnownFrames, item);
item = new SavedAction(instance);
- instance->insertItem(AllPluginBreakpoints, item);
item->setSettingsKey("DebugMode", "AllPluginBreakpoints");
+ instance->insertItem(AllPluginBreakpoints, item);
item = new SavedAction(instance);
- instance->insertItem(SelectedPluginBreakpoints, item);
item->setSettingsKey("DebugMode", "SelectedPluginBreakpoints");
+ instance->insertItem(SelectedPluginBreakpoints, item);
item = new SavedAction(instance);
- instance->insertItem(NoPluginBreakpoints, item);
item->setSettingsKey("DebugMode", "NoPluginBreakpoints");
+ instance->insertItem(NoPluginBreakpoints, item);
item = new SavedAction(instance);
- instance->insertItem(SelectedPluginBreakpointsPattern, item);
item->setSettingsKey("DebugMode", "SelectedPluginBreakpointsPattern");
+ instance->insertItem(SelectedPluginBreakpointsPattern, item);
+
+ item = new SavedAction(instance);
+ item->setSettingsKey("DebugMode", "MaximalStackDepth");
+ item->setDefaultValue(20);
+ instance->insertItem(MaximalStackDepth, item);
return instance;
}
diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h
index 3972aafce2a..079a879bc79 100644
--- a/src/plugins/debugger/debuggeractions.h
+++ b/src/plugins/debugger/debuggeractions.h
@@ -76,6 +76,9 @@ enum DebuggerActionCode
GdbEnvironment,
GdbScriptFile,
+ // Stack
+ MaximalStackDepth,
+
// Watchers & Locals
WatchExpression,
WatchExpressionInWindow,
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 2ecd00ffc2a..fbe80e45882 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -297,6 +297,8 @@ QWidget *GdbOptionPage::createPage(QWidget *parent)
m_ui.checkBoxSkipKnownFrames);
m_group.insert(theDebuggerAction(UseToolTips),
m_ui.checkBoxUseToolTips);
+ m_group.insert(theDebuggerAction(MaximalStackDepth),
+ m_ui.spinBoxMaximalStackDepth);
m_ui.lineEditSelectedPluginBreakpointsPattern->
setEnabled(theDebuggerAction(SelectedPluginBreakpoints)->value().toBool());
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index b53bee96073..e6717fcbc00 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -886,7 +886,7 @@ void GdbEngine::handleTargetCore(const GdbResultRecord &record)
qq->stackHandler()->setCurrentIndex(0);
updateLocals(); // Quick shot
- sendSynchronizedCommand("-stack-list-frames", StackListFrames);
+ reloadStack();
if (supportsThreads())
sendSynchronizedCommand("-thread-list-ids", StackListThreads, 0);
@@ -1303,6 +1303,13 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
#endif
}
+void GdbEngine::reloadStack()
+{
+ QString cmd = "-stack-list-frames";
+ if (int stackDepth = theDebuggerAction(MaximalStackDepth)->value().toInt())
+ cmd += " 0 " + QString::number(stackDepth);
+ sendSynchronizedCommand(cmd, StackListFrames);
+}
void GdbEngine::handleAsyncOutput2(const GdbMi &data)
{
@@ -1315,7 +1322,7 @@ void GdbEngine::handleAsyncOutput2(const GdbMi &data)
updateLocals(); // Quick shot
int currentId = data.findChild("thread-id").data().toInt();
- sendSynchronizedCommand("-stack-list-frames", StackListFrames);
+ reloadStack();
if (supportsThreads())
sendSynchronizedCommand("-thread-list-ids", StackListThreads, currentId);
@@ -1739,7 +1746,7 @@ void GdbEngine::handleAttach()
qq->stackHandler()->setCurrentIndex(0);
updateLocals(); // Quick shot
- sendSynchronizedCommand("-stack-list-frames", StackListFrames);
+ reloadStack();
if (supportsThreads())
sendSynchronizedCommand("-thread-list-ids", StackListThreads, 0);
@@ -2441,7 +2448,7 @@ void GdbEngine::handleStackSelectThread(const GdbResultRecord &record, int)
Q_UNUSED(record);
//qDebug("FIXME: StackHandler::handleOutput: SelectThread");
q->showStatusMessage(tr("Retrieving data for stack view..."), 3000);
- sendCommand("-stack-list-frames", StackListFrames);
+ reloadStack();
}
@@ -2458,7 +2465,8 @@ void GdbEngine::handleStackListFrames(const GdbResultRecord &record)
int topFrame = -1;
- for (int i = 0; i != stack.childCount(); ++i) {
+ int n = stack.childCount();
+ for (int i = 0; i != n; ++i) {
//qDebug() << "HANDLING FRAME: " << stack.childAt(i).toString();
const GdbMi frameMi = stack.childAt(i);
StackFrame frame(i);
@@ -2495,6 +2503,16 @@ void GdbEngine::handleStackListFrames(const GdbResultRecord &record)
topFrame = i;
}
+ if (n >= theDebuggerAction(MaximalStackDepth)->value().toInt()) {
+ StackFrame frame(n);
+ frame.file = "...";
+ frame.function = "...";
+ frame.from = "...";
+ frame.line = 0;
+ frame.address = "...";
+ stackFrames.append(frame);
+ }
+
qq->stackHandler()->setFrames(stackFrames);
#if 0
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index 49b823e957b..0ea15012e98 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -280,6 +280,7 @@ private:
void handleStackListFrames(const GdbResultRecord &record);
void handleStackSelectThread(const GdbResultRecord &record, int cookie);
void handleStackListThreads(const GdbResultRecord &record, int cookie);
+ void reloadStack();
//
diff --git a/src/plugins/debugger/gdboptionpage.ui b/src/plugins/debugger/gdboptionpage.ui
index 5b690eeb6b0..c3994e7b8e9 100644
--- a/src/plugins/debugger/gdboptionpage.ui
+++ b/src/plugins/debugger/gdboptionpage.ui
@@ -6,8 +6,8 @@
0
0
- 410
- 435
+ 429
+ 452
@@ -182,6 +182,42 @@ you indent to use or the name of a terminal that will be searched in your PATH.<
+ -
+
+
-
+
+
+ Maximal stack depth:
+
+
+
+ -
+
+
+ Qt::LeftToRight
+
+
+ false
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ <unlimited>
+
+
+ 999
+
+
+ 5
+
+
+ 10
+
+
+
+
+
diff --git a/src/plugins/debugger/stackhandler.cpp b/src/plugins/debugger/stackhandler.cpp
index a131bc00428..17c8168c7c3 100644
--- a/src/plugins/debugger/stackhandler.cpp
+++ b/src/plugins/debugger/stackhandler.cpp
@@ -37,11 +37,9 @@
using namespace Debugger::Internal;
-StackFrame::StackFrame(int l) :
- level(l),
- line(0)
-{
-}
+StackFrame::StackFrame(int l)
+ : level(l), line(0)
+{}
bool StackFrame::isUsable() const
{
@@ -183,6 +181,7 @@ bool StackHandler::isDebuggingDumpers() const
return false;
}
+
////////////////////////////////////////////////////////////////////////
//
// ThreadsHandler
diff --git a/src/plugins/debugger/stackwindow.cpp b/src/plugins/debugger/stackwindow.cpp
index f105f057f13..e0340ce0ae8 100644
--- a/src/plugins/debugger/stackwindow.cpp
+++ b/src/plugins/debugger/stackwindow.cpp
@@ -29,7 +29,7 @@
#include "stackwindow.h"
-#include "stackhandler.h"
+#include "debuggeractions.h"
#include
@@ -102,6 +102,8 @@ void StackWindow::contextMenuEvent(QContextMenuEvent *ev)
menu.addSeparator();
menu.addAction(act1);
menu.addAction(act2);
+ menu.addSeparator();
+ menu.addAction(theDebuggerAction(SettingsDialog));
QAction *act = menu.exec(ev->globalPos());