[utilities/kate] addons: Remove backtracebrowser plugin
Christoph Cullmann <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 29e5dd9a71879437afd0a00d802e5342df244623 by Christoph Cullmann, on behalf of Waqar Ahmed.
Committed on 01/08/2026 at 20:12.
Pushed by cullmann into branch 'master'.
Remove backtracebrowser plugin
I think its not useful now. We have links plugin that can allow you to
browse a backtrace and jump to locations.
M +0 -1 addons/CMakeLists.txt
D +0 -21 addons/backtracebrowser/CMakeLists.txt
D +0 -3 addons/backtracebrowser/Messages.sh
D +0 -24 addons/backtracebrowser/autotests/CMakeLists.txt
D +0 -84 addons/backtracebrowser/autotests/btbrowsertest.cpp
D +0 -24 addons/backtracebrowser/autotests/btbrowsertest.h
D +0 -108 addons/backtracebrowser/btbrowserwidget.ui
D +0 -122 addons/backtracebrowser/btconfigwidget.ui
D +0 -79 addons/backtracebrowser/btdatabase.cpp
D +0 -38 addons/backtracebrowser/btdatabase.h
D +0 -80 addons/backtracebrowser/btfileindexer.cpp
D +0 -39 addons/backtracebrowser/btfileindexer.h
D +0 -159 addons/backtracebrowser/btparser.cpp
D +0 -44 addons/backtracebrowser/btparser.h
D +0 -390 addons/backtracebrowser/katebacktracebrowser.cpp
D +0 -136 addons/backtracebrowser/katebacktracebrowser.h
D +0 -88 addons/backtracebrowser/katebacktracebrowserplugin.json
https://invent.kde.org/utilities/kate/-/commit/29e5dd9a71879437afd0a00d802e5342df244623
diff --git a/addons/CMakeLists.txt b/addons/CMakeLists.txt
index cb8178d158..f71fd15ff6 100644
--- a/addons/CMakeLists.txt
+++ b/addons/CMakeLists.txt
@@ -2,7 +2,6 @@ function (kate_add_plugin name)
kcoreaddons_add_plugin(${name} INSTALL_NAMESPACE "kf6/ktexteditor")
endfunction()
-ecm_optional_add_subdirectory(backtracebrowser)
ecm_optional_add_subdirectory(close-except-like) # Close all documents except this one (or similar).
ecm_optional_add_subdirectory(colorpicker) # Inline color preview/picker
ecm_optional_add_subdirectory(show-nonprintable)
diff --git a/addons/backtracebrowser/CMakeLists.txt b/addons/backtracebrowser/CMakeLists.txt
deleted file mode 100644
index 94884f0800..0000000000
--- a/addons/backtracebrowser/CMakeLists.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-kate_add_plugin(katebacktracebrowserplugin)
-target_compile_definitions(katebacktracebrowserplugin PRIVATE TRANSLATION_DOMAIN="katebacktracebrowserplugin")
-target_link_libraries(katebacktracebrowserplugin PRIVATE KF6::I18n KF6::TextEditor KF6::KIOWidgets)
-
-ki18n_wrap_ui(katebacktracebrowserplugin btbrowserwidget.ui btconfigwidget.ui)
-target_sources(
- katebacktracebrowserplugin
- PRIVATE
- katebacktracebrowser.cpp
- btparser.cpp
- btfileindexer.cpp
- btdatabase.cpp
-)
-
-if (ENABLE_PCH)
- target_precompile_headers(katebacktracebrowserplugin REUSE_FROM katepch)
-endif()
-
-if(BUILD_TESTING)
- add_subdirectory(autotests)
-endif()
diff --git a/addons/backtracebrowser/Messages.sh b/addons/backtracebrowser/Messages.sh
deleted file mode 100644
index fca0deff0b..0000000000
--- a/addons/backtracebrowser/Messages.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#! /bin/sh
-$EXTRACTRC *.ui >> rc.cpp
-$XGETTEXT *.cpp -o $podir/katebacktracebrowserplugin.pot
diff --git a/addons/backtracebrowser/autotests/CMakeLists.txt b/addons/backtracebrowser/autotests/CMakeLists.txt
deleted file mode 100644
index 5f62ad992f..0000000000
--- a/addons/backtracebrowser/autotests/CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-include(ECMMarkAsTest)
-
-add_executable(btbrowser_test "")
-target_include_directories(btbrowser_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
-
-find_package(Qt6Test ${QT_MIN_VERSION} QUIET REQUIRED)
-target_link_libraries(
- btbrowser_test
- PRIVATE
- Qt::Widgets
- Qt::Test
-)
-
-target_sources(btbrowser_test PRIVATE
- btbrowsertest.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/../btparser.cpp
-)
-
-if(ENABLE_PCH)
- target_precompile_headers(btbrowser_test REUSE_FROM katepch_tests)
-endif()
-
-add_test(NAME plugin-btbrowser_test COMMAND btbrowser_test ${OFFSCREEN_QPA})
-ecm_mark_as_test(btbrowser_test)
diff --git a/addons/backtracebrowser/autotests/btbrowsertest.cpp b/addons/backtracebrowser/autotests/btbrowsertest.cpp
deleted file mode 100644
index 4297e6c15e..0000000000
--- a/addons/backtracebrowser/autotests/btbrowsertest.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/* This file is part of the KDE project
- *
- * SPDX-FileCopyrightText: 2014 Dominik Haumann <[email protected]>
- *
- * SPDX-License-Identifier: LGPL-2.0-or-later
- */
-
-#include "btbrowsertest.h"
-#include "btparser.h"
-
-#include <QtTestWidgets>
-
-QTEST_MAIN(KateBtBrowserTest)
-
-void KateBtBrowserTest::initTestCase()
-{
-}
-
-void KateBtBrowserTest::cleanupTestCase()
-{
-}
-
-void KateBtBrowserTest::testParser()
-{
- // make sure the different types of gdb backtraces are parsed correctly
-
- // 1) #24 0xb688ff8e in QApplication::notify (this=0xbf997e8c, receiver=0x82607e8, e=0xbf997074) at kernel/qapplication.cpp:3115
- // 2) #39 0xb634211c in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
- // 3) #41 0x0805e690 in ?? ()
- // 4) #5 0xffffe410 in __kernel_vsyscall ()
-
- QString bt = QStringLiteral("#24 0xb688ff8e in QApplication::notify (this=0xbf997e8c, receiver=0x82607e8, e=0xbf997074) at kernel/qapplication.cpp:3115");
- QList<BtInfo> info = KateBtParser::parseBacktrace(bt);
-
- QVERIFY(info.size() == 1);
- QCOMPARE(info[0].type, BtInfo::Source);
- QCOMPARE(info[0].original, bt);
- QCOMPARE(info[0].filename, QLatin1String("kernel/qapplication.cpp"));
- QCOMPARE(info[0].function, QLatin1String("QApplication::notify (this=0xbf997e8c, receiver=0x82607e8, e=0xbf997074)"));
- QCOMPARE(info[0].address, QLatin1String("0xb688ff8e"));
- QCOMPARE(info[0].line, 3115);
- QCOMPARE(info[0].step, 24);
-
- bt = QStringLiteral("#39 0xb634211c in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0");
- info = KateBtParser::parseBacktrace(bt);
- QVERIFY(info.size() == 1);
- QCOMPARE(info[0].type, BtInfo::Lib);
- QCOMPARE(info[0].original, bt);
- QCOMPARE(info[0].filename, QLatin1String("/usr/lib/libglib-2.0.so.0"));
- QCOMPARE(info[0].function, QLatin1String("g_main_context_dispatch ()"));
- QCOMPARE(info[0].address, QLatin1String("0xb634211c"));
- QCOMPARE(info[0].line, -1);
- QCOMPARE(info[0].step, 39);
-
- bt = QStringLiteral("#41 0x0805e690 in ?? ()");
- info = KateBtParser::parseBacktrace(bt);
- QVERIFY(info.size() == 1);
- QCOMPARE(info[0].type, BtInfo::Unknown);
- QCOMPARE(info[0].original, bt);
- QCOMPARE(info[0].filename, QString());
- QCOMPARE(info[0].function, QString());
- QCOMPARE(info[0].address, QLatin1String("0x0805e690"));
- QCOMPARE(info[0].line, -1);
- QCOMPARE(info[0].step, 41);
-
- bt = QStringLiteral("#5 0xffffe410 in __kernel_vsyscall ()");
- info = KateBtParser::parseBacktrace(bt);
- QVERIFY(info.size() == 1);
- QCOMPARE(info[0].type, BtInfo::Unknown);
- QCOMPARE(info[0].original, bt);
- QCOMPARE(info[0].filename, QString());
- QCOMPARE(info[0].function, QLatin1String("__kernel_vsyscall ()"));
- QCOMPARE(info[0].address, QLatin1String("0xffffe410"));
- QCOMPARE(info[0].line, -1);
- QCOMPARE(info[0].step, 5);
-
- bt = QStringLiteral(" Thread 1 (Thread 0x7fb6ba260780 (LWP 16447)):\n[KCrash Handler]");
- info = KateBtParser::parseBacktrace(bt);
- QVERIFY(info.empty());
-}
-
-#include "moc_btbrowsertest.cpp"
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/autotests/btbrowsertest.h b/addons/backtracebrowser/autotests/btbrowsertest.h
deleted file mode 100644
index 41072ebd6c..0000000000
--- a/addons/backtracebrowser/autotests/btbrowsertest.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* This file is part of the KDE project
- *
- * SPDX-FileCopyrightText: 2014 Dominik Haumann <[email protected]>
- *
- * SPDX-License-Identifier: LGPL-2.0-or-later
- */
-
-#pragma once
-
-#include <QObject>
-
-class KateBtBrowserTest : public QObject
-{
- Q_OBJECT
-
-public Q_SLOTS:
- void initTestCase();
- void cleanupTestCase();
-
-private Q_SLOTS:
- void testParser();
-};
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/btbrowserwidget.ui b/addons/backtracebrowser/btbrowserwidget.ui
deleted file mode 100644
index f76709748d..0000000000
--- a/addons/backtracebrowser/btbrowserwidget.ui
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>BtBrowserWidget</class>
- <widget class="QWidget" name="BtBrowserWidget">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>457</width>
- <height>232</height>
- </rect>
- </property>
- <layout class="QGridLayout">
- <property name="margin" stdset="0">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <widget class="QTreeWidget" name="lstBacktrace">
- <property name="frameShape">
- <enum>QFrame::Shape::NoFrame</enum>
- </property>
- <property name="horizontalScrollBarPolicy">
- <enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
- </property>
- <property name="rootIsDecorated">
- <bool>false</bool>
- </property>
- <property name="itemsExpandable">
- <bool>false</bool>
- </property>
- <property name="allColumnsShowFocus">
- <bool>true</bool>
- </property>
- <property name="columnCount">
- <number>4</number>
- </property>
- <column>
- <property name="text">
- <string>#</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>File</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Line</string>
- </property>
- </column>
- <column>
- <property name="text">
- <string>Function</string>
- </property>
- </column>
- </widget>
- </item>
- <item row="1" column="0">
- <layout class="QHBoxLayout">
- <item>
- <widget class="QLabel" name="lblStatus">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item>
- <spacer>
- <property name="orientation">
- <enum>Qt::Orientation::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>31</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="btnConfigure">
- <property name="text">
- <string>Configure Paths...</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="btnClipboard">
- <property name="text">
- <string>Use Clipboard</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="btnBacktrace">
- <property name="text">
- <string>Load File...</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/addons/backtracebrowser/btconfigwidget.ui b/addons/backtracebrowser/btconfigwidget.ui
deleted file mode 100644
index 2ea799c121..0000000000
--- a/addons/backtracebrowser/btconfigwidget.ui
+++ /dev/null
@@ -1,122 +0,0 @@
-<ui version="4.0" >
- <class>BtConfigWidget</class>
- <widget class="QWidget" name="BtConfigWidget" >
- <layout class="QVBoxLayout" name="verticalLayout_2" >
- <property name="spacing" >
- <number>0</number>
- </property>
- <property name="margin" >
- <number>0</number>
- </property>
- <item>
- <widget class="QGroupBox" name="gFolderList" >
- <property name="title" >
- <string>Search Folders</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout" >
- <item>
- <widget class="QLabel" name="label" >
- <property name="text" >
- <string>Please add the source folders in which to search for the files in the backtrace:</string>
- </property>
- <property name="textFormat" >
- <enum>Qt::PlainText</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KUrlRequester" name="edtUrl" />
- </item>
- <item>
- <widget class="QListWidget" name="lstFolders" >
- <property name="whatsThis" >
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the source folders here. As example, for KDE development you have to add the Qt and Frameworks source folders:</p>
-<ul style="-qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">/path/to/kdelibs</li>
-<li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">/path/to/qt/src</li></ul></body></html></string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2" >
- <item>
- <spacer name="horizontalSpacer" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>218</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QPushButton" name="btnRemove" >
- <property name="text" >
- <string>&Remove</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="btnAdd" >
- <property name="text" >
- <string>&Add</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout" >
- <item>
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>File types:</string>
- </property>
- <property name="textFormat" >
- <enum>Qt::PlainText</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLineEdit" name="edtExtensions" >
- <property name="whatsThis" >
- <string>List of file extensions. Example: *.cpp, *.h, *.c, etc...</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>KUrlRequester</class>
- <extends>QFrame</extends>
- <header>kurlrequester.h</header>
- </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
diff --git a/addons/backtracebrowser/btdatabase.cpp b/addons/backtracebrowser/btdatabase.cpp
deleted file mode 100644
index ad75b1b24c..0000000000
--- a/addons/backtracebrowser/btdatabase.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-#include "btdatabase.h"
-
-#include <QDataStream>
-#include <QDir>
-#include <QFile>
-
-void KateBtDatabase::loadFromFile(const QString &url)
-{
- QFile file(url);
- if (file.open(QIODevice::ReadOnly)) {
- QMutexLocker locker(&mutex);
- QDataStream ds(&file);
- ds >> db;
- }
- // qDebug() << "Number of entries in the backtrace database" << url << ":" << db.size();
-}
-
-void KateBtDatabase::saveToFile(const QString &url) const
-{
- QFile file(url);
- if (file.open(QIODevice::WriteOnly)) {
- QMutexLocker locker(&mutex);
- QDataStream ds(&file);
- ds << db;
- }
- // qDebug() << "Saved backtrace database to" << url;
-}
-
-QString KateBtDatabase::value(const QString &key)
-{
- // key is either of the form "foo/bar.txt" or only "bar.txt"
- QString file = key;
- const QStringList split_key = key.split(u'/');
- if (split_key.size() > 1) {
- file = split_key[1];
- }
-
- QMutexLocker locker(&mutex);
- if (db.contains(file)) {
- const QStringList &sl = db.value(file);
- for (int i = 0; i < sl.size(); ++i) {
- if (sl[i].indexOf(key) != -1) {
- return sl[i];
- }
- }
- // try to use the first one
- if (!sl.empty()) {
- return sl[0];
- }
- }
-
- return {};
-}
-
-void KateBtDatabase::add(const QString &folder, const QStringList &files)
-{
- QMutexLocker locker(&mutex);
- for (const QString &file : files) {
- QStringList &sl = db[file];
- QString entry = QDir::fromNativeSeparators(folder + u'/' + file);
- if (!sl.contains(entry)) {
- sl << entry;
- }
- }
-}
-
-int KateBtDatabase::size() const
-{
- QMutexLocker locker(&mutex);
- return db.size();
-}
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/btdatabase.h b/addons/backtracebrowser/btdatabase.h
deleted file mode 100644
index 3d604ddb3a..0000000000
--- a/addons/backtracebrowser/btdatabase.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-#pragma once
-
-#include <QHash>
-#include <QMutex>
-#include <QString>
-#include <QStringList>
-
-class KateBtDatabase
-{
-public:
- KateBtDatabase()
- {
- }
- ~KateBtDatabase()
- {
- }
-
- void loadFromFile(const QString &url);
- void saveToFile(const QString &url) const;
-
- QString value(const QString &key);
-
- void add(const QString &folder, const QStringList &files);
-
- int size() const;
-
-private:
- mutable QMutex mutex;
- QHash<QString, QStringList> db;
-};
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/btfileindexer.cpp b/addons/backtracebrowser/btfileindexer.cpp
deleted file mode 100644
index 3a5aa796b3..0000000000
--- a/addons/backtracebrowser/btfileindexer.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-#include "btfileindexer.h"
-#include "btdatabase.h"
-
-#include <QDir>
-#include <QtCore/qlogging.h>
-
-BtFileIndexer::BtFileIndexer(KateBtDatabase *database)
- : cancelAsap(false)
- , db(database)
-{
-}
-
-BtFileIndexer::~BtFileIndexer() = default;
-
-void BtFileIndexer::setSearchPaths(const QStringList &urls)
-{
- searchPaths.clear();
- for (const QString &url : urls) {
- if (!searchPaths.contains(url)) {
- searchPaths += url;
- }
- }
-}
-
-void BtFileIndexer::setFilter(const QStringList &fileFilter)
-{
- filter = fileFilter;
- qDebug("filter: %ls", qUtf16Printable(filter.join(u",")));
-}
-
-void BtFileIndexer::run()
-{
- if (filter.empty()) {
- qDebug("Filter is empty. Aborting.");
- return;
- }
-
- cancelAsap = false;
- for (int i = 0; i < searchPaths.size(); ++i) {
- if (cancelAsap) {
- break;
- }
- indexFiles(searchPaths[i]);
- }
- qDebug("Backtrace file database contains %d files", db->size());
-}
-
-void BtFileIndexer::cancel()
-{
- cancelAsap = true;
-}
-
-void BtFileIndexer::indexFiles(const QString &url)
-{
- QDir dir(url);
- if (!dir.exists()) {
- return;
- }
-
- QStringList files = dir.entryList(filter, QDir::Files | QDir::NoSymLinks | QDir::Readable | QDir::NoDotAndDotDot | QDir::CaseSensitive);
- db->add(url, files);
-
- QStringList subdirs = dir.entryList(QDir::Dirs | QDir::NoSymLinks | QDir::Readable | QDir::NoDotAndDotDot | QDir::CaseSensitive);
- for (int i = 0; i < subdirs.size(); ++i) {
- if (cancelAsap) {
- break;
- }
- indexFiles(url + u'/' + subdirs[i]);
- }
-}
-
-#include "moc_btfileindexer.cpp"
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/btfileindexer.h b/addons/backtracebrowser/btfileindexer.h
deleted file mode 100644
index 252826f49e..0000000000
--- a/addons/backtracebrowser/btfileindexer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-#pragma once
-
-#include <QString>
-#include <QStringList>
-#include <QThread>
-
-class KateBtDatabase;
-
-class BtFileIndexer : public QThread
-{
- Q_OBJECT
-public:
- explicit BtFileIndexer(KateBtDatabase *db);
- ~BtFileIndexer() override;
- void setSearchPaths(const QStringList &urls);
-
- void setFilter(const QStringList &filter);
-
- void cancel();
-
-protected:
- void run() override;
- void indexFiles(const QString &url);
-
-private:
- bool cancelAsap;
- QStringList searchPaths;
- QStringList filter;
-
- KateBtDatabase *db;
-};
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/btparser.cpp b/addons/backtracebrowser/btparser.cpp
deleted file mode 100644
index 5cee8cca95..0000000000
--- a/addons/backtracebrowser/btparser.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-#include "btparser.h"
-
-#include <QRegularExpression>
-#include <QStringList>
-#include <QtCore/qlogging.h>
-
-static QString eolDelimiter(const QString &str)
-{
- // find the split character
- QString separator(u'\n');
- if (str.indexOf(QLatin1String("\r\n")) != -1) {
- separator = QStringLiteral("\r\n");
- } else if (str.indexOf(u'\r') != -1) {
- separator = u'\r';
- }
- return separator;
-}
-
-static bool lineNoLessThan(const QString &lhs, const QString &rhs)
-{
- static const QRegularExpression rx(QStringLiteral("^#(\\d+)"));
- QRegularExpressionMatch match = rx.match(lhs);
- int ilhs = match.capturedStart(0);
- int lhsLn = match.captured(1).toInt();
- match = rx.match(rhs);
- int irhs = match.capturedStart(0);
- int rhsLn = match.captured(1).toInt();
- if (ilhs != -1 && irhs != -1) {
- return lhsLn < rhsLn;
- } else {
- return lhs < rhs;
- }
-}
-
-static QStringList normalizeBt(const QStringList &l)
-{
- QStringList normalized;
-
- bool append = false;
-
- for (int i = 0; i < l.size(); ++i) {
- QString str = l[i].trimmed();
- if (str.length()) {
- if (str[0] == u'#') {
- normalized << str;
- append = true;
- } else if (append) {
- normalized.last() += u' ' + str;
- }
- } else {
- append = false;
- }
- }
-
- std::sort(normalized.begin(), normalized.end(), lineNoLessThan);
-
- // now every single line contains a whole backtrace info
- return normalized;
-}
-
-static BtInfo parseBtLine(const QString &line)
-{
- // the syntax types we support are
- // a) #24 0xb688ff8e in QApplication::notify (this=0xbf997e8c, receiver=0x82607e8, e=0xbf997074) at kernel/qapplication.cpp:3115
- // b) #39 0xb634211c in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
- // c) #41 0x0805e690 in ?? ()
- // d) #5 0xffffe410 in __kernel_vsyscall ()
-
- // try a) cap #number(1), address(2), function(3), filename(4), linenumber(5)
- static const QRegularExpression rxa(QStringLiteral("^#(\\d+)\\s+(0x\\w+)\\s+in\\s+(.+)\\s+at\\s+(.+):(\\d+)$"));
- QRegularExpressionMatch match = rxa.match(line);
- if (match.hasMatch()) {
- BtInfo info;
- info.original = line;
- info.filename = match.captured(4);
- info.function = match.captured(3);
- info.address = match.captured(2);
- info.line = match.captured(5).toInt();
- info.step = match.captured(1).toInt();
- info.type = BtInfo::Source;
- return info;
- }
-
- // try b) cap #number(1), address(2), function(3), lib(4)
- static const QRegularExpression rxb(QStringLiteral("^#(\\d+)\\s+(0x\\w+)\\s+in\\s+(.+)\\s+from\\s+(.+)$"));
- match = rxb.match(line);
- if (match.hasMatch()) {
- BtInfo info;
- info.original = line;
- info.filename = match.captured(4);
- info.function = match.captured(3);
- info.address = match.captured(2);
- info.line = -1;
- info.step = match.captured(1).toInt();
- info.type = BtInfo::Lib;
- return info;
- }
-
- // try c) #41 0x0805e690 in ?? ()
- static const QRegularExpression rxc(QStringLiteral("^#(\\d+)\\s+(0x\\w+)\\s+in\\s+\\?\\?\\s+\\(\\)$"));
- match = rxc.match(line);
- if (match.hasMatch()) {
- BtInfo info;
- info.original = line;
- info.filename = QString();
- info.function = QString();
- info.address = match.captured(2);
- info.line = -1;
- info.step = match.captured(1).toInt();
- info.type = BtInfo::Unknown;
- return info;
- }
-
- // try d) #5 0xffffe410 in __kernel_vsyscall ()
- static const QRegularExpression rxd(QStringLiteral("^#(\\d+)\\s+(0x\\w+)\\s+in\\s+(.+)$"));
- match = rxd.match(line);
- if (match.hasMatch()) {
- BtInfo info;
- info.original = line;
- info.filename = QString();
- info.function = match.captured(3);
- info.address = match.captured(2);
- info.line = -1;
- info.step = match.captured(1).toInt();
- info.type = BtInfo::Unknown;
- return info;
- }
-
- qDebug("Unknown backtrace line: %ls", qUtf16Printable(line));
-
- BtInfo info;
- info.type = BtInfo::Invalid;
- return info;
-}
-
-QList<BtInfo> KateBtParser::parseBacktrace(const QString &bt)
-{
- QStringList l = bt.split(eolDelimiter(bt), Qt::SkipEmptyParts);
-
- l = normalizeBt(l);
-
- QList<BtInfo> btList;
- for (int i = 0; i < l.size(); ++i) {
- BtInfo info = parseBtLine(l[i]);
- if (info.type != BtInfo::Invalid) {
- btList.append(parseBtLine(l[i]));
- }
- }
-
- return btList;
-}
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/btparser.h b/addons/backtracebrowser/btparser.h
deleted file mode 100644
index 60771c5ae3..0000000000
--- a/addons/backtracebrowser/btparser.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-#pragma once
-
-#include <QList>
-#include <QString>
-
-class BtInfo
-{
-public:
- enum Type {
- Source = 0,
- Lib,
- Unknown,
- Invalid
- };
-
- /**
- * Default constructor => invalid element
- */
- BtInfo() = default;
-
-public:
- QString original;
- QString filename;
- QString function;
- QString address;
- int step = -1;
- int line = -1;
-
- Type type = Invalid;
-};
-
-namespace KateBtParser
-{
-QList<BtInfo> parseBacktrace(const QString &bt);
-
-}
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/katebacktracebrowser.cpp b/addons/backtracebrowser/katebacktracebrowser.cpp
deleted file mode 100644
index c94d144a71..0000000000
--- a/addons/backtracebrowser/katebacktracebrowser.cpp
+++ /dev/null
@@ -1,390 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-// BEGIN Includes
-#include "katebacktracebrowser.h"
-
-#include "btparser.h"
-
-#include <KConfigGroup>
-#include <KLineEdit>
-#include <KLocalizedString> // i18n
-#include <KPluginFactory>
-#include <KSharedConfig>
-
-#include <KTextEditor/Cursor>
-#include <KTextEditor/View>
-
-#include <QClipboard>
-#include <QDialogButtonBox>
-#include <QDir>
-#include <QFile>
-#include <QFileDialog>
-#include <QFileInfo>
-#include <QStandardPaths>
-#include <QTreeWidget>
-#include <QUrl>
-// END Includes
-
-K_PLUGIN_FACTORY_WITH_JSON(KateBtBrowserFactory, "katebacktracebrowserplugin.json", registerPlugin<KateBtBrowserPlugin>();)
-
-KateBtBrowserPlugin *KateBtBrowserPlugin::s_self = nullptr;
-
-QStringList fileExtensions()
-{
- return QStringList{QStringLiteral("*.cpp"),
- QStringLiteral("*.cxx"),
- QStringLiteral("*.c"),
- QStringLiteral("*.cc"),
- QStringLiteral("*.h"),
- QStringLiteral("*.hpp"),
- QStringLiteral("*.hxx"),
- QStringLiteral("*.moc")};
-}
-
-KateBtBrowserPlugin::KateBtBrowserPlugin(QObject *parent)
- : KTextEditor::Plugin(parent)
- , indexer(&db)
-{
- s_self = this;
- db.loadFromFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/katebtbrowser/backtracedatabase.db"));
-}
-
-KateBtBrowserPlugin::~KateBtBrowserPlugin()
-{
- if (indexer.isRunning()) {
- indexer.cancel();
- indexer.wait();
- }
-
- const QString path = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/katebtbrowser");
- QDir().mkpath(path);
- db.saveToFile(path + QStringLiteral("/backtracedatabase.db"));
-
- s_self = nullptr;
-}
-
-KateBtBrowserPlugin &KateBtBrowserPlugin::self()
-{
- return *s_self;
-}
-
-QObject *KateBtBrowserPlugin::createView(KTextEditor::MainWindow *mainWindow)
-{
- auto *view = new KateBtBrowserPluginView(this, mainWindow);
- return view;
-}
-
-KateBtDatabase &KateBtBrowserPlugin::database()
-{
- return db;
-}
-
-BtFileIndexer &KateBtBrowserPlugin::fileIndexer()
-{
- return indexer;
-}
-
-void KateBtBrowserPlugin::startIndexer()
-{
- if (indexer.isRunning()) {
- indexer.cancel();
- indexer.wait();
- }
- KConfigGroup cg(KSharedConfig::openConfig(), QStringLiteral("backtracebrowser"));
- indexer.setSearchPaths(cg.readEntry("search-folders", QStringList()));
- indexer.setFilter(cg.readEntry("file-extensions", fileExtensions()));
- indexer.start();
- Q_EMIT newStatus(i18n("Indexing files..."));
-}
-
-int KateBtBrowserPlugin::configPages() const
-{
- return 1;
-}
-
-KTextEditor::ConfigPage *KateBtBrowserPlugin::configPage(int number, QWidget *parent)
-{
- if (number == 0) {
- return new KateBtConfigWidget(parent);
- }
-
- return nullptr;
-}
-
-KateBtBrowserPluginView::KateBtBrowserPluginView(KateBtBrowserPlugin *plugin, KTextEditor::MainWindow *mainWindow)
- : QObject(mainWindow)
-{
- // init console
- QWidget *toolview = mainWindow->createToolView(plugin,
- QStringLiteral("kate_private_plugin_katebacktracebrowserplugin"),
- KTextEditor::MainWindow::Bottom,
- QIcon::fromTheme(QStringLiteral("tools-report-bug")),
- i18n("Backtrace"));
- m_widget = new KateBtBrowserWidget(mainWindow, toolview);
-
- connect(plugin, &KateBtBrowserPlugin::newStatus, m_widget, &KateBtBrowserWidget::setStatus);
-}
-
-KateBtBrowserPluginView::~KateBtBrowserPluginView()
-{
- // cleanup, kill toolview + widget
- auto toolview = m_widget->parent();
- delete m_widget;
- delete toolview;
-}
-
-KateBtBrowserWidget::KateBtBrowserWidget(KTextEditor::MainWindow *mainwindow, QWidget *parent)
- : QWidget(parent)
- , mw(mainwindow)
-{
- setupUi(this);
-
- timer.setSingleShot(true);
- connect(&timer, &QTimer::timeout, this, &KateBtBrowserWidget::clearStatus);
- connect(btnBacktrace, &QPushButton::clicked, this, &KateBtBrowserWidget::loadFile);
- connect(btnClipboard, &QPushButton::clicked, this, &KateBtBrowserWidget::loadClipboard);
- connect(btnConfigure, &QPushButton::clicked, this, &KateBtBrowserWidget::configure);
- connect(lstBacktrace, &QTreeWidget::itemActivated, this, &KateBtBrowserWidget::itemActivated);
-}
-
-KateBtBrowserWidget::~KateBtBrowserWidget()
-{
-}
-
-void KateBtBrowserWidget::loadFile()
-{
- QString url = QFileDialog::getOpenFileName(mw->window(), i18n("Load Backtrace"));
- QFile f(url);
- if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QString str = QString::fromUtf8(f.readAll());
- loadBacktrace(str);
- }
-}
-
-void KateBtBrowserWidget::loadClipboard()
-{
- QString bt = QApplication::clipboard()->text();
- loadBacktrace(bt);
-}
-
-void KateBtBrowserWidget::loadBacktrace(const QString &bt)
-{
- const QList<BtInfo> infos = KateBtParser::parseBacktrace(bt);
-
- lstBacktrace->clear();
- for (const BtInfo &info : infos) {
- auto *it = new QTreeWidgetItem(lstBacktrace);
- it->setData(0, Qt::DisplayRole, QString::number(info.step));
- it->setData(0, Qt::ToolTipRole, QString::number(info.step));
- QFileInfo fi(info.filename);
- it->setData(1, Qt::DisplayRole, fi.fileName());
- it->setData(1, Qt::ToolTipRole, info.filename);
-
- if (info.type == BtInfo::Source) {
- it->setData(2, Qt::DisplayRole, QString::number(info.line));
- it->setData(2, Qt::ToolTipRole, QString::number(info.line));
- it->setData(2, Qt::UserRole, QVariant(info.line));
- }
- it->setData(3, Qt::DisplayRole, info.function);
- it->setData(3, Qt::ToolTipRole, info.function);
-
- lstBacktrace->addTopLevelItem(it);
- }
- lstBacktrace->resizeColumnToContents(0);
- lstBacktrace->resizeColumnToContents(1);
- lstBacktrace->resizeColumnToContents(2);
-
- if (lstBacktrace->topLevelItemCount()) {
- setStatus(i18n("Loading backtrace succeeded"));
- } else {
- setStatus(i18n("Loading backtrace failed"));
- }
-}
-
-void KateBtBrowserWidget::configure()
-{
- KateBtConfigDialog dlg(mw->window());
- dlg.exec();
-}
-
-void KateBtBrowserWidget::itemActivated(QTreeWidgetItem *item, int column)
-{
- Q_UNUSED(column);
-
- QVariant variant = item->data(2, Qt::UserRole);
- if (variant.isValid()) {
- int line = variant.toInt();
- QString file = QDir::fromNativeSeparators(item->data(1, Qt::ToolTipRole).toString());
- file = QDir::cleanPath(file);
-
- QString path = file;
- // if not absolute path + exists, try to find with index
- if (!QFile::exists(path)) {
- // try to match the backtrace forms ".*/foo/bar.txt" and "foo/bar.txt"
- static const QRegularExpression rx1(QStringLiteral("/([^/]+)/([^/]+)$"));
- QRegularExpressionMatch match = rx1.match(file);
- if (match.hasMatch()) {
- file = match.captured(1) + u'/' + match.captured(2);
- } else {
- static const QRegularExpression rx2(QStringLiteral("([^/]+)/([^/]+)$"));
- if (rx2.match(file).hasMatch()) {
- // file is of correct form
- } else {
- qDebug("file pattern did not match: %ls", qUtf16Printable(file));
- setStatus(i18n("File not found: %1", file));
- return;
- }
- }
- path = KateBtBrowserPlugin::self().database().value(file);
- }
-
- if (!path.isEmpty() && QFile::exists(path)) {
- KTextEditor::View *kv = mw->openUrl(QUrl::fromLocalFile(path));
- kv->setCursorPosition(KTextEditor::Cursor(line - 1, 0));
- kv->setFocus();
- setStatus(i18n("Opened file: %1", file));
- }
- } else {
- setStatus(i18n("No debugging information available"));
- }
-}
-
-void KateBtBrowserWidget::setStatus(const QString &status)
-{
- lblStatus->setText(status);
- timer.start(10 * 1000);
-}
-
-void KateBtBrowserWidget::clearStatus()
-{
- lblStatus->setText(QString());
-}
-
-KateBtConfigWidget::KateBtConfigWidget(QWidget *parent)
- : KTextEditor::ConfigPage(parent)
-{
- setupUi(this);
- edtUrl->setMode(KFile::Directory);
- edtUrl->setUrl(QUrl(QDir().absolutePath()));
-
- reset();
-
- connect(btnAdd, &QPushButton::clicked, this, &KateBtConfigWidget::add);
- connect(btnRemove, &QPushButton::clicked, this, &KateBtConfigWidget::remove);
- connect(edtExtensions, &QLineEdit::textChanged, this, &KateBtConfigWidget::textChanged);
-
- m_changed = false;
-}
-
-KateBtConfigWidget::~KateBtConfigWidget() = default;
-
-QString KateBtConfigWidget::name() const
-{
- return i18n("Backtrace");
-}
-
-QString KateBtConfigWidget::fullName() const
-{
- return i18n("Backtrace Settings");
-}
-
-QIcon KateBtConfigWidget::icon() const
-{
- return QIcon::fromTheme(QStringLiteral("tools-report-bug"));
-}
-
-void KateBtConfigWidget::apply()
-{
- if (m_changed) {
- QStringList sl;
- for (int i = 0; i < lstFolders->count(); ++i) {
- sl << lstFolders->item(i)->data(Qt::DisplayRole).toString();
- }
- KConfigGroup cg(KSharedConfig::openConfig(), QStringLiteral("backtracebrowser"));
- cg.writeEntry("search-folders", sl);
-
- QString filter = edtExtensions->text();
- filter.replace(u',', u' ').replace(u';', u' ');
- cg.writeEntry("file-extensions", filter.split(u' ', Qt::SkipEmptyParts));
-
- KateBtBrowserPlugin::self().startIndexer();
- m_changed = false;
- }
-}
-
-void KateBtConfigWidget::reset()
-{
- KConfigGroup cg(KSharedConfig::openConfig(), QStringLiteral("backtracebrowser"));
- lstFolders->clear();
- lstFolders->addItems(cg.readEntry("search-folders", QStringList()));
- edtExtensions->setText(cg.readEntry("file-extensions", fileExtensions()).join(u' '));
-}
-
-void KateBtConfigWidget::defaults()
-{
- lstFolders->clear();
- edtExtensions->setText(fileExtensions().join(u' '));
-
- m_changed = true;
-}
-
-void KateBtConfigWidget::add()
-{
- QDir url(edtUrl->lineEdit()->text());
- if (url.exists()) {
- if (lstFolders->findItems(url.absolutePath(), Qt::MatchExactly).empty()) {
- lstFolders->addItem(url.absolutePath());
- Q_EMIT changed();
- m_changed = true;
- }
- }
-}
-
-void KateBtConfigWidget::remove()
-{
- QListWidgetItem *item = lstFolders->currentItem();
- if (item) {
- delete item;
- Q_EMIT changed();
- m_changed = true;
- }
-}
-
-void KateBtConfigWidget::textChanged()
-{
- Q_EMIT changed();
- m_changed = true;
-}
-
-KateBtConfigDialog::KateBtConfigDialog(QWidget *parent)
- : QDialog(parent)
-{
- setWindowTitle(i18n("Backtrace Browser Settings"));
-
- m_configWidget = new KateBtConfigWidget(this);
-
- auto *layout = new QVBoxLayout(this);
-
- auto *box = new QDialogButtonBox(this);
- box->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
-
- layout->addWidget(m_configWidget);
- layout->addWidget(box);
-
- connect(this, &KateBtConfigDialog::accepted, m_configWidget, &KateBtConfigWidget::apply);
- connect(box, &QDialogButtonBox::accepted, this, &KateBtConfigDialog::accept);
- connect(box, &QDialogButtonBox::rejected, this, &KateBtConfigDialog::reject);
-}
-
-KateBtConfigDialog::~KateBtConfigDialog()
-{
-}
-
-#include "katebacktracebrowser.moc"
-#include "moc_katebacktracebrowser.cpp"
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/katebacktracebrowser.h b/addons/backtracebrowser/katebacktracebrowser.h
deleted file mode 100644
index 1a396b5199..0000000000
--- a/addons/backtracebrowser/katebacktracebrowser.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/* This file is part of the KDE project
- SPDX-FileCopyrightText: 2008-2014 Dominik Haumann <dhaumann kde org>
-
- SPDX-License-Identifier: LGPL-2.0-only
-*/
-
-#pragma once
-
-#include <KTextEditor/Plugin>
-#include <ktexteditor/configpage.h>
-#include <ktexteditor/mainwindow.h>
-
-#include "btdatabase.h"
-#include "btfileindexer.h"
-#include "ui_btbrowserwidget.h"
-#include "ui_btconfigwidget.h"
-
-#include <QDialog>
-#include <QString>
-#include <QTimer>
-
-class KateBtConfigWidget;
-class KateBtBrowserWidget;
-
-class KateBtBrowserPlugin : public KTextEditor::Plugin
-{
- Q_OBJECT
-
-public:
- explicit KateBtBrowserPlugin(QObject *parent);
- ~KateBtBrowserPlugin() override;
-
- static KateBtBrowserPlugin &self();
-
- QObject *createView(KTextEditor::MainWindow *mainWindow) override;
-
- KateBtDatabase &database();
- BtFileIndexer &fileIndexer();
-
- void startIndexer();
-
-Q_SIGNALS:
- void newStatus(const QString &);
-
-public:
- int configPages() const override;
- KTextEditor::ConfigPage *configPage(int number, QWidget *parent = nullptr) override;
-
- //
- // private data
- //
-private:
- KateBtDatabase db;
- BtFileIndexer indexer;
- static KateBtBrowserPlugin *s_self;
-};
-
-class KateBtBrowserPluginView : public QObject
-{
- Q_OBJECT
-
-public:
- KateBtBrowserPluginView(KateBtBrowserPlugin *plugin, KTextEditor::MainWindow *mainWindow);
-
- /**
- * Virtual destructor.
- */
- ~KateBtBrowserPluginView() override;
-
-private:
- KateBtBrowserWidget *m_widget;
-};
-
-class KateBtBrowserWidget : public QWidget, public Ui::BtBrowserWidget
-{
- Q_OBJECT
-
-public:
- KateBtBrowserWidget(KTextEditor::MainWindow *mainwindow, QWidget *parent);
-
- ~KateBtBrowserWidget() override;
-
- void loadBacktrace(const QString &bt);
-
-public Q_SLOTS:
- void loadFile();
- void loadClipboard();
- void configure();
- void clearStatus();
- void setStatus(const QString &status);
-
-private Q_SLOTS:
- void itemActivated(QTreeWidgetItem *item, int column);
-
-private:
- KTextEditor::MainWindow *mw;
- QTimer timer;
-};
-
-class KateBtConfigWidget : public KTextEditor::ConfigPage, private Ui::BtConfigWidget
-{
- Q_OBJECT
-public:
- explicit KateBtConfigWidget(QWidget *parent = nullptr);
- ~KateBtConfigWidget() override;
-
- QString name() const override;
- QString fullName() const override;
- QIcon icon() const override;
-
-public Q_SLOTS:
- void apply() override;
- void reset() override;
- void defaults() override;
-
-private Q_SLOTS:
- void add();
- void remove();
- void textChanged();
-
-private:
- bool m_changed;
-};
-
-class KateBtConfigDialog : public QDialog
-{
- Q_OBJECT
-public:
- KateBtConfigDialog(QWidget *parent = nullptr);
- ~KateBtConfigDialog() override;
-
-private:
- KateBtConfigWidget *m_configWidget;
-};
-
-// kate: space-indent on; indent-width 4; replace-tabs on;
diff --git a/addons/backtracebrowser/katebacktracebrowserplugin.json b/addons/backtracebrowser/katebacktracebrowserplugin.json
deleted file mode 100644
index 27f35bf21f..0000000000
--- a/addons/backtracebrowser/katebacktracebrowserplugin.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
- "KPlugin": {
- "Description": "C/C++ Backtrace navigation tool view",
- "Description[ar]": "عرض أداة التنقل التتبع الخلفي في لغة سي/سي++",
- "Description[az]": "C/C++ geri izləmə naviqasiya aləti görünüşü",
- "Description[bg]": "Изглед с инструменти за навигация на обратно проследяване на C/C++",
- "Description[ca@valencia]": "Vista d'eina del navegador per a la traça inversa de C/C++",
- "Description[ca]": "Vista d'eina del navegador per a la traça inversa de C/C++",
- "Description[cs]": "Nástroj pro procházení backtrace v C/C++",
- "Description[de]": "Ansicht zur Navigation in C/C++ Backtraces",
- "Description[el]": "Προβολή εργαλείου πλοήγησης για ανίχνευση προς τα πίσω σε C/C++",
- "Description[en_GB]": "C/C++ Backtrace navigation tool view",
- "Description[eo]": "Perspektivo de C/C++ retrospura navigilo",
- "Description[es]": "Vista de la herramienta de navegación por trazas inversas de C/C++",
- "Description[eu]": "C/C++ aztarnetan nabigatzeko tresnaren ikuspegia",
- "Description[fi]": "C/C++-jäljitysnavigointityökalunäkymä",
- "Description[fr]": "Vue des outils de navigation pour les piles d'appels C / C++",
- "Description[ga]": "Amharc uirlis nascleanúna Cúl-rianaithe C/C++",
- "Description[gl]": "Vista da ferramenta de navegación por trazados inversos de C e C++.",
- "Description[he]": "תצוגת כלי ניווט במעקבי קריאות של C/C++",
- "Description[hu]": "C/C++ visszakövetési navigációs eszköznézet",
- "Description[ia]": "Vista de instrumento de navigation de retraciamento in C/C++",
- "Description[ie]": "Utensile de navigation de backtraces de C/C++",
- "Description[it]": "Vista dello strumento di navigazione di backtrace C/C++",
- "Description[ka]": "C/C++ უკუტრეისის ნავიგაციის ხელსაწყოს ხედი",
- "Description[ko]": "C/C++ 역추적 탐색기 도구 보기",
- "Description[lv]": "C/C++ atpakaļceļa navigācijas rīka skats",
- "Description[my]": "C/C++ နောက်ကြောင်းလိုက်ကိရိယာမြင်ကွင်း",
- "Description[nb]": "Navigasjonsverktøy for C/C++-tilbakesporing",
- "Description[nl]": "C/C++ Backtrace hulpmiddel voor navigatieweergave",
- "Description[nn]": "Navigasjonsverktøy for C-/C++-tilbakeloggar",
- "Description[pl]": "Narzędzie do poruszania się po śladzie wykonywania C/C++",
- "Description[pt]": "Ferramenta de navegação de rastreio de pilha de C/C++",
- "Description[pt_BR]": "Visualização da ferramenta de navegação Backtrace C/C++",
- "Description[ru]": "Панель навигации по стеку вызовов C/C++",
- "Description[sa]": "C/C++ Backtrace नेविगेशन टूल दृश्य",
- "Description[sk]": "Zobrazenie navigačného nástroja C/C++ Backtrace",
- "Description[sl]": "Orodje za navigacijo pogleda nazaj C/C++",
- "Description[sv]": "C/C++ navigeringsverktyg med vy av bakåtspårning",
- "Description[tr]": "C/C++ Geri iz dolaşım araç görünümü",
- "Description[uk]": "Панель навігації зворотним трасуванням C++",
- "Description[vi]": "Khung xem công cụ \"điều hướng vết ngăn xếp C/C++\"",
- "Description[zh_CN]": "C/C++ 回溯导航工具视图",
- "Description[zh_TW]": "C/C++ 回溯追蹤瀏覽工具檢視",
- "Name": "Backtrace Browser",
- "Name[ar]": "متصفّح التّتبّع الخلفيّ",
- "Name[az]": "Geri izləmə bələdçisi",
- "Name[bg]": "Проследяване на браузер",
- "Name[ca@valencia]": "Navegador de traça inversa",
- "Name[ca]": "Navegador de traça inversa",
- "Name[cs]": "Prohlížeč backtrace",
- "Name[de]": "Backtrace-Browser",
- "Name[el]": "Περιηγητής αντίστροφης ιχνηλάτησης",
- "Name[en_GB]": "Backtrace Browser",
- "Name[eo]": "Backtrace Foliumilo",
- "Name[es]": "Explorador de trazas inversas",
- "Name[eu]": "Aztarna arakatzailea",
- "Name[fi]": "Jäljitysselain",
- "Name[fr]": "Explorateur de piles d'appels",
- "Name[ga]": "Brabhsálaí Cúl-Rianaithe",
- "Name[gl]": "Navegador de trazados inversos",
- "Name[he]": "דפדפן מעקבי קריאות",
- "Name[hu]": "Visszakövetési böngésző",
- "Name[ia]": "Backtrace Browser (Navigator de retro tracia)",
- "Name[ie]": "Explorator de backtraces",
- "Name[it]": "Navigatore di backtrace",
- "Name[ka]": "გამოძახებების სტეკის დათვალიერება",
- "Name[ko]": "역추적 탐색기",
- "Name[lv]": "Atpakaļceļa pārlūks",
- "Name[my]": "နောက်ကြောင်းလိုက်ဘရောက်ဇာ",
- "Name[nb]": "Tilbakesporingsutforsker",
- "Name[nl]": "Backtrace browser",
- "Name[nn]": "Tilbakelogg-visar",
- "Name[pl]": "Przeglądarka śladu",
- "Name[pt]": "Navegador de rastreio de pilha",
- "Name[pt_BR]": "Navegador de backtrace",
- "Name[ru]": "Просмотр стека вызовов",
- "Name[sa]": "Backtrace ब्राउज़र",
- "Name[sk]": "Prehliadač Backtrace",
- "Name[sl]": "Brskalnik sledenja nazaj",
- "Name[sv]": "Bläddring i bakåtspårning",
- "Name[tr]": "Geri İz Tarayıcısı",
- "Name[uk]": "Переглядач зворотного трасування",
- "Name[vi]": "Trình duyệt vết ngăn xếp",
- "Name[zh_CN]": "回溯跟踪浏览器",
- "Name[zh_TW]": "回溯追蹤瀏覽器"
- }
-}