cutter/src/widgets/BacktraceWidget.cpp

80 lines
2.8 KiB
C++
Raw Normal View History

#include "BacktraceWidget.h"
#include "ui_BacktraceWidget.h"
2018-10-17 07:55:53 +00:00
#include "common/JsonModel.h"
#include "QHeaderView"
#include "core/MainWindow.h"
2021-01-24 14:50:13 +00:00
BacktraceWidget::BacktraceWidget(MainWindow *main)
: CutterDockWidget(main), ui(new Ui::BacktraceWidget)
{
ui->setupUi(this);
// setup backtrace model
QString PC = Core()->getRegisterName("PC");
QString SP = Core()->getRegisterName("SP");
2019-12-06 17:50:21 +00:00
modelBacktrace->setHorizontalHeaderItem(0, new QStandardItem(tr("Function")));
modelBacktrace->setHorizontalHeaderItem(1, new QStandardItem(SP));
modelBacktrace->setHorizontalHeaderItem(2, new QStandardItem(PC));
modelBacktrace->setHorizontalHeaderItem(3, new QStandardItem(tr("Description")));
modelBacktrace->setHorizontalHeaderItem(4, new QStandardItem(tr("Frame Size")));
viewBacktrace->setFont(Config()->getFont());
viewBacktrace->setModel(modelBacktrace);
viewBacktrace->verticalHeader()->setVisible(false);
2018-10-03 11:30:12 +00:00
viewBacktrace->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->verticalLayout->addWidget(viewBacktrace);
2021-01-24 14:50:13 +00:00
refreshDeferrer = createRefreshDeferrer([this]() { updateContents(); });
connect(Core(), &CutterCore::refreshAll, this, &BacktraceWidget::updateContents);
connect(Core(), &CutterCore::registersChanged, this, &BacktraceWidget::updateContents);
connect(Config(), &Configuration::fontsUpdated, this, &BacktraceWidget::fontsUpdatedSlot);
}
BacktraceWidget::~BacktraceWidget() {}
void BacktraceWidget::updateContents()
{
if (!refreshDeferrer->attemptRefresh(nullptr) || Core()->isDebugTaskInProgress()) {
return;
}
setBacktraceGrid();
}
void BacktraceWidget::setBacktraceGrid()
{
RzList *list = rz_core_debug_backtraces(Core()->core());
int i = 0;
RzListIter *iter;
RzBacktrace *bt;
CutterRzListForeach (list, iter, RzBacktrace, bt) {
QString funcName = bt->fcn ? bt->fcn->name : "";
QString pc = RzAddressString(bt->frame ? bt->frame->addr : 0);
QString sp = RzAddressString(bt->frame ? bt->frame->sp : 0);
QString frameSize = QString::number(bt->frame ? bt->frame->size : 0);
QString desc = bt->desc;
modelBacktrace->setItem(i, 0, new QStandardItem(funcName));
modelBacktrace->setItem(i, 1, new QStandardItem(sp));
modelBacktrace->setItem(i, 2, new QStandardItem(pc));
modelBacktrace->setItem(i, 3, new QStandardItem(desc));
modelBacktrace->setItem(i, 4, new QStandardItem(frameSize));
++i;
}
rz_list_free(list);
// Remove irrelevant old rows
if (modelBacktrace->rowCount() > i) {
modelBacktrace->removeRows(i, modelBacktrace->rowCount() - i);
}
viewBacktrace->setModel(modelBacktrace);
viewBacktrace->resizeColumnsToContents();
}
void BacktraceWidget::fontsUpdatedSlot()
{
viewBacktrace->setFont(Config()->getFont());
}