- enhancement: Add "Close window" and "Move to other view" in the "Window" menu

- enhancement: Auto open CPU info dialog, if the program in debug is stopped at a position that have no source file.
  - enhancement: "add watchpoint" when debug. It's hitted when the watch variable is modified, or it's out of scope.
  - enhancement: Switch current call stack frame in the CPU info dialog
  - fix: Shouldn't try evaluate value of the selection in the cpu info dialog.
  - enhancement: Show oct/bin/bin value in the memory view's tooltip.
  - Don't set optimization level to -Og in the Debug compiler set. (Some variable can't be view in the memory view, because they are put in registers.)
This commit is contained in:
Roy Qu 2023-03-03 17:20:33 +08:00
parent eac1077de1
commit da3dda97e3
16 changed files with 1303 additions and 965 deletions

View File

@ -7,7 +7,6 @@ Red Panda C++ Version 2.16
- enhancement: Add cfi directives for asm syntaxer in linux.
- change: Editor option "Scroll past end of line" default to false.
- emhancement: Improve display of disassembled codes in the cpu info dialog.
- change: Set optimization level to -Og for Debug compiler settings by default.
- fix: Can't correctly parse function pointer var definition.
- enhancement: Improve support for function pointer typedefs.
- enhancement: Improve support for function pointer vars.
@ -15,6 +14,11 @@ Red Panda C++ Version 2.16
- change: Don't rebuild the whole project when run/debug, if only contents of project unit file is modified.
- fix: rebuild may not work, if project's parallel build option is enabled.
- enhancement: Add "Close window" and "Move to other view" in the "Window" menu
- enhancement: Auto open CPU info dialog, if the program in debug is stopped at a position that have no source file.
- enhancement: "add watchpoint" when debug. It's hitted when the watch variable is modified, or it's out of scope.
- enhancement: Switch current call stack frame in the CPU info dialog
- fix: Shouldn't try evaluate value of the selection in the cpu info dialog.
- enhancement: Show oct/bin/bin value in the memory view's tooltip.
Red Panda C++ Version 2.15

View File

@ -194,6 +194,8 @@ bool Debugger::start(int compilerSetIndex, const QString& inferior, const QStrin
&MainWindow::removeActiveBreakpoints);
connect(mReader, &DebugReader::inferiorStopped,pMainWindow,
&MainWindow::setActiveBreakpoint);
connect(mReader, &DebugReader::watchpointHitted,pMainWindow,
&MainWindow::onWatchpointHitted);
connect(mReader, &DebugReader::errorNoSymbolTable,pMainWindow,
&MainWindow::stopDebugForNoSymbolTable);
connect(mReader, &DebugReader::inferiorStopped,this,
@ -485,6 +487,14 @@ void Debugger::loadForProject(const QString &filename, const QString &projectFol
}
}
void Debugger::addWatchpoint(const QString &expression)
{
QString s=expression.trimmed();
if (!s.isEmpty()) {
sendCommand("-break-watch",s,DebugCommandSource::Other);
}
}
void Debugger::addWatchVar(const QString &expression)
{
// Don't allow duplicates...
@ -923,7 +933,7 @@ void Debugger::updateEval(const QString &value)
void Debugger::updateDisassembly(const QString& file, const QString& func, const QStringList &value)
{
if (pMainWindow->cpuDialog()) {
pMainWindow->cpuDialog()->setDisassembly(file,func,value);
pMainWindow->cpuDialog()->setDisassembly(file,func,value,mBacktraceModel->backtraces());
}
}
@ -1088,12 +1098,14 @@ void DebugReader::processResult(const QByteArray &result)
return;
switch(resultType) {
case GDBMIResultType::BreakpointTable:
case GDBMIResultType::Frame:
case GDBMIResultType::Locals:
break;
case GDBMIResultType::Breakpoint:
handleBreakpoint(multiValues["bkpt"].object());
return;
case GDBMIResultType::Frame:
handleFrame(multiValues["frame"]);
return;
case GDBMIResultType::FrameStack:
handleStack(multiValues["stack"].array());
return;
@ -1163,27 +1175,33 @@ void DebugReader::processExecAsyncRecord(const QByteArray &line)
return;
}
mUpdateCPUInfo = true;
GDBMIResultParser::ParseValue frame(multiValues["frame"]);
if (frame.isValid()) {
GDBMIResultParser::ParseObject frameObj = frame.object();
mCurrentAddress = frameObj["addr"].hexValue();
mCurrentLine = frameObj["line"].intValue();
if (mDebugger->forceUTF8())
mCurrentFile = frameObj["fullname"].utf8PathValue();
else
mCurrentFile = frameObj["fullname"].pathValue();
mCurrentFunc = frameObj["func"].value();
}
handleFrame(multiValues["frame"]);
if (reason == "signal-received") {
mSignalReceived = true;
mSignalName = multiValues["signal-name"].value();
mSignalMeaning = multiValues["signal-meaning"].value();
} else if (reason == "watchpoint-trigger") {
QString var,oldVal,newVal;
GDBMIResultParser::ParseValue wpt=multiValues["wpt"];
if (wpt.isValid()) {
GDBMIResultParser::ParseObject wptObj = wpt.object();
var=wptObj["exp"].value();
}
GDBMIResultParser::ParseValue varValue=multiValues["value"];
if (varValue.isValid()) {
GDBMIResultParser::ParseObject valueObj = varValue.object();
oldVal=valueObj["old"].value();
newVal=valueObj["new"].value();
}
if (!var.isEmpty()) {
emit watchpointHitted(var,oldVal,newVal);
}
}
runInferiorStoppedHook();
if (mCurrentCmd && mCurrentCmd->source == DebugCommandSource::Console)
emit inferiorStopped(mCurrentFile, mCurrentLine,false);
emit inferiorStopped(mCurrentFile, mCurrentLine, false);
else
emit inferiorStopped(mCurrentFile, mCurrentLine,true);
emit inferiorStopped(mCurrentFile, mCurrentLine, true);
}
}
@ -1466,6 +1484,23 @@ void DebugReader::handleBreakpoint(const GDBMIResultParser::ParseObject& breakpo
emit breakpointInfoGetted(filename, line , number);
}
void DebugReader::handleFrame(const GDBMIResultParser::ParseValue &frame)
{
if (frame.isValid()) {
GDBMIResultParser::ParseObject frameObj = frame.object();
bool ok;
mCurrentAddress = frameObj["addr"].hexValue(ok);
if (!ok)
mCurrentAddress=0;
mCurrentLine = frameObj["line"].intValue();
if (mDebugger->forceUTF8())
mCurrentFile = frameObj["fullname"].utf8PathValue();
else
mCurrentFile = frameObj["fullname"].pathValue();
mCurrentFunc = frameObj["func"].value();
}
}
void DebugReader::handleStack(const QList<GDBMIResultParser::ParseValue> & stack)
{
mDebugger->backtraceModel()->clear();
@ -3113,6 +3148,31 @@ QVariant MemoryModel::data(const QModelIndex &index, int role) const
return s;
} else
return QString("%1").arg(line->datas[col],2,16,QChar('0'));
} else if (role == Qt::ToolTipRole) {
if (col<line->datas.count()) {
QString s =tr("dec: %1").arg(line->datas[col])
+"<br/>"
+tr("hex: %1").arg(line->datas[col],2,16,QChar('0'))
+"<br/>"
+tr("bin: %1").arg(line->datas[col],8,2,QChar('0'))
+"<br/>";
QString chVal;
if (line->datas[col]==0) {
chVal="\\0";
} else if (line->datas[col]=='\n') {
chVal="\\n";
} else if (line->datas[col]=='\t') {
chVal="\\t";
} else if (line->datas[col]=='\r') {
chVal="\\r";
} else if (line->datas[col]>'\n' && line->datas[col]<127) {
chVal=QChar(line->datas[col]);
}
if (!chVal.isEmpty()) {
s+=tr("ascii: \'%1\'").arg(chVal);
}
return s;
}
}
return QVariant();
}

View File

@ -340,6 +340,7 @@ public:
void loadForNonproject(const QString &filename);
void loadForProject(const QString& filename, const QString& projectFolder);
void addWatchpoint(const QString& expression);
//watch vars
void addWatchVar(const QString& expression);
void modifyWatchVarExpression(const QString& oldExpr, const QString& newExpr);
@ -522,6 +523,7 @@ signals:
void errorNoSymbolTable();
void breakpointInfoGetted(const QString& filename, int line, int number);
void inferiorContinued();
void watchpointHitted(const QString& var, const QString& oldVal, const QString& newVal);
void inferiorStopped(const QString& filename, int line, bool setFocus);
void localsUpdated(const QStringList& localsValue);
void evalUpdated(const QString& value);
@ -554,6 +556,7 @@ private:
bool outputTerminated(const QByteArray& text);
void handleBreakpoint(const GDBMIResultParser::ParseObject& breakpoint);
void handleFrame(const GDBMIResultParser::ParseValue &frame);
void handleStack(const QList<GDBMIResultParser::ParseValue> & stack);
void handleLocalVariables(const QList<GDBMIResultParser::ParseValue> & variables);
void handleEvaluation(const QString& value);
@ -606,7 +609,7 @@ private:
bool mReceivedSFWarning;
int mCurrentLine;
int mCurrentAddress;
qulonglong mCurrentAddress;
QString mCurrentFunc;
QString mCurrentFile;
QStringList mConsoleOutput;

View File

@ -1903,8 +1903,7 @@ void Editor::onTooltipTimer()
break;
case TipType::Identifier:
if (pMainWindow->debugger()->executing() && !pMainWindow->debugger()->inferiorRunning()) {
if (mParentPageControl)
s = getWordAtPosition(this,p, pBeginPos,pEndPos, WordPurpose::wpEvaluation); // debugging
s = getWordAtPosition(this,p, pBeginPos,pEndPos, WordPurpose::wpEvaluation); // debugging
} else if (!mCompletionPopup->isVisible()
&& !mHeaderCompletionPopup->isVisible()) {
expression = getExpressionAtPosition(p);
@ -1977,7 +1976,9 @@ void Editor::onTooltipTimer()
&& !mHeaderCompletionPopup->isVisible()) {
if (pMainWindow->debugger()->executing()
&& (pSettings->editor().enableDebugTooltips())) {
showDebugHint(s,p.line);
if (mParentPageControl) {
showDebugHint(s,p.line);
}
} else if (pSettings->editor().enableIdentifierToolTips()) {
hint = getParserHint(expression, s, p.line);
}
@ -3851,7 +3852,7 @@ Editor::TipType Editor::getTipType(QPoint point, QSynedit::BufferCoord& pos)
return TipType::Selection;
} else if (mParser && mParser->isIncludeLine(document()->getLine(pos.line-1))) {
return TipType::Preprocessor;
}else if (attr->tokenType() == QSynedit::TokenType::Identifier) {
} else if (attr->tokenType() == QSynedit::TokenType::Identifier) {
return TipType::Identifier;
} else if (attr->tokenType() == QSynedit::TokenType::Keyword) {
return TipType::Keyword;

View File

@ -37,6 +37,7 @@ GDBMIResultParser::GDBMIResultParser()
mResultTypes.insert("-var-create",GDBMIResultType::CreateVar);
mResultTypes.insert("-var-list-children",GDBMIResultType::ListVarChildren);
mResultTypes.insert("-var-update",GDBMIResultType::UpdateVarValue);
mResultTypes.insert("-stack-info-frame",GDBMIResultType::Frame);
}
bool GDBMIResultParser::parse(const QByteArray &record, const QString& command, GDBMIResultType &type, ParseObject& multiValues)
@ -349,26 +350,22 @@ const GDBMIResultParser::ParseObject &GDBMIResultParser::ParseValue::object() co
return mObject;
}
int GDBMIResultParser::ParseValue::intValue(int defaultValue) const
int64_t GDBMIResultParser::ParseValue::intValue(int defaultValue) const
{
//Q_ASSERT(mType == ParseValueType::Value);
bool ok;
int value = QString(mValue).toInt(&ok);
qlonglong value = QString(mValue).toLongLong(&ok);
if (ok)
return value;
else
return defaultValue;
}
int GDBMIResultParser::ParseValue::hexValue(int defaultValue) const
qulonglong GDBMIResultParser::ParseValue::hexValue(bool &ok) const
{
//Q_ASSERT(mType == ParseValueType::Value);
bool ok;
int value = QString(mValue).toInt(&ok,16);
if (ok)
return value;
else
return defaultValue;
qulonglong value = QString(mValue).toULongLong(&ok,16);
return value;
}
QString GDBMIResultParser::ParseValue::pathValue() const

View File

@ -74,8 +74,8 @@ public:
const QByteArray &value() const;
const QList<ParseValue> &array() const;
const ParseObject &object() const;
int intValue(int defaultValue=-1) const;
int hexValue(int defaultValue=-1) const;
qlonglong intValue(int defaultValue=-1) const;
qulonglong hexValue(bool &ok) const;
QString pathValue() const;
QString utf8PathValue() const;

View File

@ -1019,16 +1019,17 @@ void MainWindow::removeActiveBreakpoints()
void MainWindow::setActiveBreakpoint(QString fileName, int Line, bool setFocus)
{
removeActiveBreakpoints();
if (!fileExists(fileName))
return;
// Then active the current line in the current file
Editor *e = openFile(fileName);
if (e!=nullptr) {
e->setActiveBreakpointFocus(Line,setFocus);
if (setFocus) {
activateWindow();
}
} else {
pMainWindow->showCPUInfoDialog();
}
if (setFocus) {
activateWindow();
}
return;
}
void MainWindow::updateDPI(int oldDPI, int /*newDPI*/)
@ -4892,6 +4893,7 @@ void MainWindow::onEditorContextMenu(const QPoint& pos)
menu.addSeparator();
if (canDebug) {
menu.addAction(ui->actionAdd_Watch);
menu.addAction(ui->actionAdd_Watchpoint);
menu.addAction(ui->actionToggle_Breakpoint);
menu.addAction(ui->actionClear_all_breakpoints);
menu.addSeparator();
@ -4981,6 +4983,7 @@ void MainWindow::disableDebugActions()
ui->actionStep_Out->setEnabled(false);
ui->actionRun_To_Cursor->setEnabled(false);
ui->actionContinue->setEnabled(false);
ui->actionAdd_Watchpoint->setEnabled(false);
ui->cbEvaluate->setEnabled(false);
ui->cbMemoryAddress->setEnabled(false);
if (mCPUDialog) {
@ -4997,6 +5000,7 @@ void MainWindow::enableDebugActions()
ui->actionStep_Out->setEnabled(!mDebugger->inferiorRunning());
ui->actionRun_To_Cursor->setEnabled(!mDebugger->inferiorRunning());
ui->actionContinue->setEnabled(!mDebugger->inferiorRunning());
ui->actionAdd_Watchpoint->setEnabled(!mDebugger->inferiorRunning());
ui->cbEvaluate->setEnabled(!mDebugger->inferiorRunning());
ui->cbMemoryAddress->setEnabled(!mDebugger->inferiorRunning());
if (mCPUDialog) {
@ -5034,6 +5038,17 @@ void MainWindow::onTodoParseFinished()
{
}
void MainWindow::onWatchpointHitted(const QString &var, const QString &oldVal, const QString &newVal)
{
QMessageBox::information(this,
tr("Watchpoint hitted"),
tr("Value of \"%1\" has changed:").arg(var)
+"<br />"
+tr("Old value: %1").arg(oldVal)
+"<br />"
+tr("New value: %1").arg(newVal));
}
void MainWindow::prepareProjectForCompile()
{
if (!mProject)
@ -6698,19 +6713,7 @@ void MainWindow::on_searchView_doubleClicked(const QModelIndex &index)
void MainWindow::on_tblStackTrace_doubleClicked(const QModelIndex &index)
{
PTrace trace = mDebugger->backtraceModel()->backtrace(index.row());
if (trace) {
Editor *e = openFile(trace->filename);
if (e) {
e->setCaretPositionAndActivate(trace->line,1);
}
mDebugger->sendCommand("-stack-select-frame", QString("%1").arg(trace->level));
mDebugger->sendCommand("-stack-list-variables", "--all-values");
mDebugger->sendCommand("-var-update", "--all-values *");
if (this->mCPUDialog) {
this->mCPUDialog->updateInfo();
}
}
switchCurrentStackTrace(index.row());
}
@ -7637,8 +7640,12 @@ void MainWindow::updateVCSActions()
canBranch =!mFileSystemModelIconProvider.VCSRepository()->hasChangedFiles()
&& !mFileSystemModelIconProvider.VCSRepository()->hasStagedFiles();
}
ui->actionGit_Remotes->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Create_Repository->setEnabled(!hasRepository && shouldEnable);
ui->actionGit_Push->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Pull->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Fetch->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Log->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Commit->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Branch->setEnabled(hasRepository && shouldEnable && canBranch);
@ -8468,6 +8475,27 @@ QList<QAction *> MainWindow::listShortCutableActions()
return actions;
}
void MainWindow::switchCurrentStackTrace(int idx)
{
PTrace trace = mDebugger->backtraceModel()->backtrace(idx);
if (trace) {
Editor *e = openFile(trace->filename);
if (e) {
e->setCaretPositionAndActivate(trace->line,1);
}
mDebugger->sendCommand("-stack-select-frame", QString("%1").arg(trace->level));
mDebugger->sendCommand("-stack-list-variables", "--all-values");
mDebugger->sendCommand("-var-update", "--all-values *");
if (this->mCPUDialog) {
this->mCPUDialog->updateInfo();
}
if (idx!=ui->tblStackTrace->currentIndex().row()) {
ui->tblStackTrace->setCurrentIndex(ui->tblStackTrace->model()->index(idx,0));
}
}
}
void MainWindow::on_actionTool_Window_Bars_triggered()
{
@ -9595,3 +9623,19 @@ void MainWindow::on_actionIA_32_Assembly_Language_Reference_Manual_triggered()
QDesktopServices::openUrl(QUrl("https://docs.oracle.com/cd/E19455-01/806-3773/index.html"));
}
void MainWindow::on_actionAdd_Watchpoint_triggered()
{
QString s = "";
bool isOk;
s=QInputDialog::getText(this,
tr("Watchpoint variable name"),
tr("Stop execution when the following variable is modified (it must be visible from the currect scope):"),
QLineEdit::Normal,
s,&isOk);
if (!isOk)
return;
s = s.trimmed();
mDebugger->addWatchpoint(s);
}

View File

@ -229,6 +229,8 @@ public:
QList<QAction*> listShortCutableActions();
void switchCurrentStackTrace(int idx);
public slots:
void logToolsOutput(const QString& msg);
void onCompileIssue(PCompileIssue issue);
@ -267,6 +269,7 @@ public slots:
void onTodoParseStarted();
void onTodoFound(const QString& filename, int lineNo, int ch, const QString& line);
void onTodoParseFinished();
void onWatchpointHitted(const QString& var, const QString& oldVal, const QString& newVal);
void setActiveBreakpoint(QString FileName, int Line, bool setFocus);
void updateDPI(int oldDPI, int newDPI);
void onFileSaved(const QString& path, bool inProject);
@ -795,6 +798,8 @@ private slots:
void on_actionIA_32_Assembly_Language_Reference_Manual_triggered();
void on_actionAdd_Watchpoint_triggered();
private:
Ui::MainWindow *ui;
bool mFullInitialized;

View File

@ -170,6 +170,7 @@
<addaction name="actionStop_Execution"/>
<addaction name="separator"/>
<addaction name="actionAdd_Watch"/>
<addaction name="actionAdd_Watchpoint"/>
<addaction name="actionView_CPU_Window"/>
</widget>
<widget class="QMenu" name="menuEdit">
@ -935,7 +936,7 @@
<enum>QTabWidget::South</enum>
</property>
<property name="currentIndex">
<number>3</number>
<number>2</number>
</property>
<property name="iconSize">
<size>
@ -1131,7 +1132,7 @@
<enum>QTabWidget::North</enum>
</property>
<property name="currentIndex">
<number>3</number>
<number>1</number>
</property>
<widget class="QWidget" name="tabDebugConsole">
<attribute name="title">
@ -3290,6 +3291,9 @@
<property name="text">
<string>Generate Assembly</string>
</property>
<property name="shortcut">
<string>Ctrl+F9</string>
</property>
</action>
<action name="actionTrim_trailing_spaces">
<property name="text">
@ -3334,6 +3338,14 @@
<string>IA-32 Assembly Language Reference Manual</string>
</property>
</action>
<action name="actionAdd_Watchpoint">
<property name="text">
<string>Add Watchpoint...</string>
</property>
<property name="toolTip">
<string>Add a watchpoint that's triggered when it's modified.</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@ -2728,7 +2728,7 @@ static void setReleaseOptions(Settings::PCompilerSet pSet) {
}
static void setDebugOptions(Settings::PCompilerSet pSet, bool enableAsan = false) {
pSet->setCompileOption(CC_CMD_OPT_OPTIMIZE,"g");
//pSet->setCompileOption(CC_CMD_OPT_OPTIMIZE,"g");
pSet->setCompileOption(CC_CMD_OPT_DEBUG_INFO, COMPILER_OPTION_ON);
pSet->setCompileOption(CC_CMD_OPT_WARNING_ALL, COMPILER_OPTION_ON);
//pSet->setCompileOption(CC_CMD_OPT_WARNING_EXTRA, COMPILER_OPTION_ON);

View File

@ -5079,6 +5079,57 @@
<source>IA-32 Assembly Language Reference Manual</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add Watchpoint...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add a watchpoint that&apos;s triggered when it&apos;s modified.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Old value: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Watchpoint variable name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stop execution when the following variable is modified (it must be visible from the currect scope):</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Watchpoint hitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Value of &quot;%1&quot; has changed:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>New value: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemoryModel</name>
<message>
<source>dec: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>hex: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>bin: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ascii: &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewClassDialog</name>

File diff suppressed because it is too large Load Diff

View File

@ -4832,6 +4832,57 @@
<source>IA-32 Assembly Language Reference Manual</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add Watchpoint...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add a watchpoint that&apos;s triggered when it&apos;s modified.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Old value: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Watchpoint variable name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stop execution when the following variable is modified (it must be visible from the currect scope):</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Watchpoint hitted</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Value of &quot;%1&quot; has changed:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>New value: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemoryModel</name>
<message>
<source>dec: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>hex: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>bin: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>ascii: &apos;%1&apos;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>NewClassDialog</name>

View File

@ -27,7 +27,8 @@
CPUDialog::CPUDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::CPUDialog),
mInited(false)
mInited(false),
mSetting(false)
{
setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);
setWindowFlag(Qt::WindowContextHelpButtonHint,false);
@ -84,6 +85,7 @@ CPUDialog::~CPUDialog()
void CPUDialog::updateInfo()
{
if (pMainWindow->debugger()->executing()) {
pMainWindow->debugger()->sendCommand("-stack-info-frame", "");
// Load the registers..
sendSyntaxCommand();
pMainWindow->debugger()->sendCommand("-data-list-register-values", "N");
@ -114,9 +116,17 @@ void CPUDialog::updateDPI(float dpi)
onUpdateIcons();
}
void CPUDialog::setDisassembly(const QString& file, const QString& funcName,const QStringList& lines)
void CPUDialog::setDisassembly(const QString& file, const QString& funcName,const QStringList& lines,const QList<PTrace>& traces)
{
ui->txtFunctionName->setText(QString("%1:%2").arg(file, funcName));
mSetting=true;
ui->cbCallStack->clear();
int currentIndex=-1;
for (int i=0;i<traces.count();i++) {
ui->cbCallStack->addItem(QString("%1:%2").arg(traces[i]->filename, traces[i]->funcname));
if (file==traces[i]->filename && funcName == traces[i]->funcname)
currentIndex=i;
}
ui->cbCallStack->setCurrentIndex(currentIndex);
int activeLine = -1;
for (int i=0;i<lines.size();i++) {
QString line = lines[i];
@ -127,6 +137,7 @@ void CPUDialog::setDisassembly(const QString& file, const QString& funcName,cons
ui->txtCode->document()->setContents(lines);
if (activeLine!=-1)
ui->txtCode->setCaretXYCentered(QSynedit::BufferCoord{1,activeLine+1});
mSetting=false;
}
void CPUDialog::resetEditorFont(float dpi)
@ -216,3 +227,11 @@ void CPUDialog::showEvent(QShowEvent *event)
}
}
void CPUDialog::on_cbCallStack_currentIndexChanged(int index)
{
if (mSetting)
return ;
pMainWindow->switchCurrentStackTrace(index);
}

View File

@ -18,6 +18,7 @@
#define CPUDIALOG_H
#include <QDialog>
#include "../debugger.h"
namespace Ui {
class CPUDialog;
@ -34,7 +35,7 @@ public:
void updateButtonStates(bool enable);
public slots:
void updateDPI(float dpi);
void setDisassembly(const QString& file, const QString& funcName,const QStringList& lines);
void setDisassembly(const QString& file, const QString& funcName,const QStringList& linesconst,const QList<PTrace>& traces);
void resetEditorFont(float dpi);
signals:
void closed();
@ -43,6 +44,7 @@ private:
private:
Ui::CPUDialog *ui;
bool mInited;
bool mSetting;
// QWidget interface
protected:
void closeEvent(QCloseEvent *event) override;
@ -55,6 +57,8 @@ private slots:
void onUpdateIcons();
// QWidget interface
void on_cbCallStack_currentIndexChanged(int index);
protected:
void showEvent(QShowEvent *event) override;
};

View File

@ -74,7 +74,17 @@
</widget>
</item>
<item>
<widget class="QLineEdit" name="txtFunctionName"/>
<widget class="QComboBox" name="cbCallStack">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="insertPolicy">
<enum>QComboBox::NoInsert</enum>
</property>
</widget>
</item>
</layout>
</widget>