- 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:
parent
eac1077de1
commit
da3dda97e3
6
NEWS.md
6
NEWS.md
|
@ -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
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1903,7 +1903,6 @@ 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
|
||||
} else if (!mCompletionPopup->isVisible()
|
||||
&& !mHeaderCompletionPopup->isVisible()) {
|
||||
|
@ -1977,7 +1976,9 @@ void Editor::onTooltipTimer()
|
|||
&& !mHeaderCompletionPopup->isVisible()) {
|
||||
if (pMainWindow->debugger()->executing()
|
||||
&& (pSettings->editor().enableDebugTooltips())) {
|
||||
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;
|
||||
|
|
|
@ -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)
|
||||
qulonglong value = QString(mValue).toULongLong(&ok,16);
|
||||
return value;
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
QString GDBMIResultParser::ParseValue::pathValue() const
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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's triggered when it'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 "%1" 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: '%1'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>NewClassDialog</name>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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's triggered when it'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 "%1" 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: '%1'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>NewClassDialog</name>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue