Skip to content

Commit

Permalink
add option to set custom source paths
Browse files Browse the repository at this point in the history
this patch add allows the user to add a custom source path which will
overwrite the source path provided in the binary
this makes the disassembler, ... work if the source code directory was
moved after creating the binary

closes: #418
  • Loading branch information
lievenhey committed Jul 4, 2023
1 parent 905c095 commit f300bbf
Show file tree
Hide file tree
Showing 12 changed files with 201 additions and 39 deletions.
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ set(HOTSPOT_SRCS
callgraphwidget.ui
callgraphsettingspage.ui
frequencypage.ui
sourcepathsettings.ui
# resources:
resources.qrc
)
Expand Down
30 changes: 29 additions & 1 deletion src/models/disassemblyoutput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,32 @@ QString findBinaryForSymbol(const QStringList& debugPaths, const QStringList& ex
}
}

// not in an anonymous namespace so we can test this
QString findSourceCodeFile(const QString& originalPath, const QStringList& sourceCodePaths, const QString& sysroot)
{
if (QFile::exists(originalPath)) {
return originalPath;
}

QString sysrootPath = sysroot + QDir::separator() + originalPath;
if (QFile::exists(sysrootPath)) {
return sysrootPath;
}

for (const auto& sourcePath : sourceCodePaths) {
for (auto it = originalPath.begin(); it != originalPath.end();
it = std::find(++it, originalPath.end(), QDir::separator())) {
QString path = sourcePath + QDir::separator() + QString(it, std::distance(it, originalPath.end()));
QFileInfo info(path);
if (info.exists()) {
return info.canonicalFilePath();
}
}
}

return originalPath; // fallback
}

static ObjectdumpOutput objdumpParse(const QByteArray& output)
{
QVector<DisassemblyOutput::DisassemblyLine> disassemblyLines;
Expand Down Expand Up @@ -208,6 +234,7 @@ static ObjectdumpOutput objdumpParse(const QByteArray& output)

DisassemblyOutput DisassemblyOutput::disassemble(const QString& objdump, const QString& arch,
const QStringList& debugPaths, const QStringList& extraLibPaths,
const QStringList& sourceCodePaths, const QString& sysroot,
const Data::Symbol& symbol)
{
DisassemblyOutput disassemblyOutput;
Expand Down Expand Up @@ -276,6 +303,7 @@ DisassemblyOutput DisassemblyOutput::disassemble(const QString& objdump, const Q

const auto objdumpOutput = objdumpParse(output);
disassemblyOutput.disassemblyLines = objdumpOutput.disassemblyLines;
disassemblyOutput.mainSourceFileName = objdumpOutput.mainSourceFileName;
disassemblyOutput.mainSourceFileName =
findSourceCodeFile(objdumpOutput.mainSourceFileName, sourceCodePaths, sysroot);
return disassemblyOutput;
}
6 changes: 5 additions & 1 deletion src/models/disassemblyoutput.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ struct DisassemblyOutput
}

static DisassemblyOutput disassemble(const QString& objdump, const QString& arch, const QStringList& debugPaths,
const QStringList& extraLibPaths, const Data::Symbol& symbol);
const QStringList& extraLibPaths, const QStringList& sourceCodePaths,
const QString& sysroot, const Data::Symbol& symbol);
};

QString findSourceCodeFile(const QString& originalPath, const QStringList& sourceCodePaths, const QString& sysroot);

Q_DECLARE_TYPEINFO(DisassemblyOutput::DisassemblyLine, Q_MOVABLE_TYPE);
6 changes: 5 additions & 1 deletion src/resultscallercalleepage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "models/callercalleemodel.h"
#include "models/callercalleeproxy.h"
#include "models/costdelegate.h"
#include "models/disassemblyoutput.h"
#include "models/filterandzoomstack.h"
#include "models/hashmodel.h"
#include "models/treemodel.h"
Expand Down Expand Up @@ -281,7 +282,10 @@ void ResultsCallerCalleePage::openEditor(const Data::Symbol& symbol)
auto it = std::find_if(map.keyBegin(), map.keyEnd(), [&symbol, this](const Data::FileLine& fileLine) {
const auto location = toSourceMapLocation(fileLine, symbol);
if (location) {
emit navigateToCode(location.path, location.lineNumber, 0);
auto settings = Settings::instance();
auto remappedSourceFile =
findSourceCodeFile(location.path, settings->sourceCodePaths(), settings->sysroot());
emit navigateToCode(remappedSourceFile, location.lineNumber, 0);
return true;
}
return false;
Expand Down
3 changes: 2 additions & 1 deletion src/resultsdisassemblypage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,8 @@ void ResultsDisassemblyPage::showDisassembly()
const auto colon = QLatin1Char(':');

showDisassembly(DisassemblyOutput::disassemble(objdump(), m_arch, settings->debugPaths().split(colon),
settings->extraLibPaths().split(colon), curSymbol));
settings->extraLibPaths().split(colon), settings->sourceCodePaths(),
settings->sysroot(), curSymbol));
}

void ResultsDisassemblyPage::showDisassembly(const DisassemblyOutput& disassemblyOutput)
Expand Down
12 changes: 12 additions & 0 deletions src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,10 @@ void Settings::loadFromFile()
sharedConfig->group("PathSettings").writeEntry("userPaths", this->userPaths());
sharedConfig->group("PathSettings").writeEntry("systemPaths", this->systemPaths());
});
m_sourceCodePaths = sharedConfig->group("PathSettings").readEntry("sourceCodePaths", QStringList());
connect(this, &Settings::sourceCodePathsChanged, this, [sharedConfig](const QStringList& paths) {
sharedConfig->group("PathSettings").writeEntry("sourceCodePaths", paths);
});

// fix build error in app image build
const auto colorScheme = KColorScheme(QPalette::Normal, KColorScheme::View, sharedConfig);
Expand Down Expand Up @@ -222,3 +226,11 @@ void Settings::loadFromFile()
sharedConfig->group("PerfPaths").writeEntry("lastUsed", envName);
});
}

void Settings::setSourceCodePaths(const QStringList& paths)
{
if (m_sourceCodePaths != paths) {
m_sourceCodePaths = paths;
emit sourceCodePathsChanged(m_sourceCodePaths);
}
}
8 changes: 8 additions & 0 deletions src/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,11 @@ class Settings : public QObject
return m_lastUsedEnvironment;
}

QStringList sourceCodePaths() const
{
return m_sourceCodePaths;
}

void loadFromFile();

signals:
Expand All @@ -158,6 +163,7 @@ class Settings : public QObject
void objdumpChanged(const QString& objdump);
void callgraphChanged();
void lastUsedEnvironmentChanged(const QString& envName);
void sourceCodePathsChanged(const QStringList& paths);

public slots:
void setPrettifySymbols(bool prettifySymbols);
Expand All @@ -178,6 +184,7 @@ public slots:
void setCallgraphColors(const QColor& active, const QColor& inactive);
void setCostAggregation(Settings::CostAggregation costAggregation);
void setLastUsedEnvironment(const QString& envName);
void setSourceCodePaths(const QStringList& paths);

private:
Settings() = default;
Expand All @@ -191,6 +198,7 @@ public slots:
QStringList m_userPaths;
QStringList m_systemPaths;
QStringList m_debuginfodUrls;
QStringList m_sourceCodePaths;

QString m_sysroot;
QString m_kallsyms;
Expand Down
65 changes: 37 additions & 28 deletions src/settingsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "ui_callgraphsettingspage.h"
#include "ui_debuginfodpage.h"
#include "ui_flamegraphsettingspage.h"
#include "ui_sourcepathsettings.h"
#include "ui_unwindsettingspage.h"

#include "multiconfigwidget.h"
Expand All @@ -32,13 +33,30 @@ KConfigGroup config()
{
return KSharedConfig::openConfig()->group("PerfPaths");
}

QPushButton* setupMultiPath(KEditListWidget* listWidget, QLabel* buddy, QWidget* previous)
{
auto editor = new KUrlRequester(listWidget);
editor->setPlaceholderText(QObject::tr("auto-detect"));
editor->setMode(KFile::LocalOnly | KFile::Directory | KFile::ExistingOnly);
buddy->setBuddy(editor);
listWidget->setCustomEditor(editor->customEditor());
QWidget::setTabOrder(previous, editor);
QWidget::setTabOrder(editor, listWidget->listView());
QWidget::setTabOrder(listWidget->listView(), listWidget->addButton());
QWidget::setTabOrder(listWidget->addButton(), listWidget->removeButton());
QWidget::setTabOrder(listWidget->removeButton(), listWidget->upButton());
QWidget::setTabOrder(listWidget->upButton(), listWidget->downButton());
return listWidget->downButton();
}
}

SettingsDialog::SettingsDialog(QWidget* parent)
: KPageDialog(parent)
, unwindPage(new Ui::UnwindSettingsPage)
, flamegraphPage(new Ui::FlamegraphSettingsPage)
, debuginfodPage(new Ui::DebuginfodPage)
, sourcePathPage(new Ui::SourcePathSettingsPage)
#if KGraphViewerPart_FOUND
, callgraphPage(new Ui::CallgraphSettingsPage)
#endif
Expand All @@ -49,6 +67,7 @@ SettingsDialog::SettingsDialog(QWidget* parent)
#if KGraphViewerPart_FOUND
addCallgraphPage();
#endif
addSourcePathPage();
}

SettingsDialog::~SettingsDialog() = default;
Expand Down Expand Up @@ -132,20 +151,6 @@ void SettingsDialog::addPathSettingsPage()

unwindPage->setupUi(page);

auto setupMultiPath = [](KEditListWidget* listWidget, QLabel* buddy, QWidget* previous) {
auto editor = new KUrlRequester(listWidget);
editor->setPlaceholderText(tr("auto-detect"));
editor->setMode(KFile::LocalOnly | KFile::Directory | KFile::ExistingOnly);
buddy->setBuddy(editor);
listWidget->setCustomEditor(editor->customEditor());
QWidget::setTabOrder(previous, editor);
QWidget::setTabOrder(editor, listWidget->listView());
QWidget::setTabOrder(listWidget->listView(), listWidget->addButton());
QWidget::setTabOrder(listWidget->addButton(), listWidget->removeButton());
QWidget::setTabOrder(listWidget->removeButton(), listWidget->upButton());
QWidget::setTabOrder(listWidget->upButton(), listWidget->downButton());
return listWidget->downButton();
};
auto lastExtraLibsWidget = setupMultiPath(unwindPage->extraLibraryPaths, unwindPage->extraLibraryPathsLabel,
unwindPage->lineEditApplicationPath);
setupMultiPath(unwindPage->debugPaths, unwindPage->debugPathsLabel, lastExtraLibsWidget);
Expand Down Expand Up @@ -219,20 +224,6 @@ void SettingsDialog::addFlamegraphPage()

flamegraphPage->setupUi(page);

auto setupMultiPath = [](KEditListWidget* listWidget, QLabel* buddy, QWidget* previous) {
auto editor = new KUrlRequester(listWidget);
editor->setMode(KFile::LocalOnly | KFile::Directory | KFile::ExistingOnly);
buddy->setBuddy(editor);
listWidget->setCustomEditor(editor->customEditor());
QWidget::setTabOrder(previous, editor);
QWidget::setTabOrder(editor, listWidget->listView());
QWidget::setTabOrder(listWidget->listView(), listWidget->addButton());
QWidget::setTabOrder(listWidget->addButton(), listWidget->removeButton());
QWidget::setTabOrder(listWidget->removeButton(), listWidget->upButton());
QWidget::setTabOrder(listWidget->upButton(), listWidget->downButton());
return listWidget->downButton();
};

auto lastUserPath = setupMultiPath(flamegraphPage->userPaths, flamegraphPage->userPathsLabel, nullptr);
setupMultiPath(flamegraphPage->systemPaths, flamegraphPage->systemPathsLabel, lastUserPath);

Expand Down Expand Up @@ -296,3 +287,21 @@ void SettingsDialog::addCallgraphPage()
callgraphPage->functionColor->color().name());
});
}

void SettingsDialog::addSourcePathPage()
{
auto page = new QWidget(this);
auto item = addPage(page, tr("Source Path"));
item->setHeader(tr("Source Path Settings"));
item->setIcon(QIcon::fromTheme(QStringLiteral("preferences-system-windows-behavior")));

sourcePathPage->setupUi(page);

connect(Settings::instance(), &Settings::sourceCodePathsChanged, this,
[this](const QStringList& paths) { sourcePathPage->sourcePaths->setItems(paths); });

setupMultiPath(sourcePathPage->sourcePaths, sourcePathPage->label, buttonBox()->button(QDialogButtonBox::Ok));

connect(buttonBox(), &QDialogButtonBox::accepted, this,
[this] { Settings::instance()->setSourceCodePaths(sourcePathPage->sourcePaths->items()); });
}
3 changes: 3 additions & 0 deletions src/settingsdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class UnwindSettingsPage;
class FlamegraphSettingsPage;
class DebuginfodPage;
class CallgraphSettingsPage;
class SourcePathSettingsPage;
}

class MultiConfigWidget;
Expand Down Expand Up @@ -46,10 +47,12 @@ class SettingsDialog : public KPageDialog
void addFlamegraphPage();
void addDebuginfodPage();
void addCallgraphPage();
void addSourcePathPage();

std::unique_ptr<Ui::UnwindSettingsPage> unwindPage;
std::unique_ptr<Ui::FlamegraphSettingsPage> flamegraphPage;
std::unique_ptr<Ui::DebuginfodPage> debuginfodPage;
std::unique_ptr<Ui::SourcePathSettingsPage> sourcePathPage;
std::unique_ptr<Ui::CallgraphSettingsPage> callgraphPage;
MultiConfigWidget* m_configs;
};
60 changes: 60 additions & 0 deletions src/sourcepathsettings.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SourcePathSettingsPage</class>
<widget class="QWidget" name="SourcePathSettingsPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>240</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="horizontalSpacing">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Source Code Search Paths:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KEditListWidget" name="sourcePaths">
<property name="buttons">
<set>KEditListWidget::All</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KEditListWidget</class>
<extends>QWidget</extends>
<header>keditlistwidget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
Loading

0 comments on commit f300bbf

Please sign in to comment.