Skip to content

Commit da76ae0

Browse files
authored
Merge pull request #1821 from Explorer09/configure-enable-backtrace
Backtrace screen (improvements over #1270)
2 parents 88e00aa + 349519f commit da76ae0

13 files changed

Lines changed: 1239 additions & 43 deletions

File tree

.github/workflows/ci.yml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@ jobs:
6060
steps:
6161
- uses: actions/checkout@v6
6262
- name: Install Dependencies
63-
run: sudo apt-get install --no-install-recommends libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev
63+
run: sudo apt-get install --no-install-recommends libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev libiberty-dev libunwind-dev
6464
- name: Bootstrap
6565
run: ./autogen.sh
6666
- name: Configure
67-
run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities || ( cat config.log; exit 1; )
67+
run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities --enable-backtrace --enable-demangling || ( cat config.log; exit 1; )
6868
- name: Build
6969
run: make -k
7070
- name: Distcheck
71-
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities'
71+
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities --enable-backtrace --enable-demangling'
7272

7373
build-ubuntu-latest-full-featured-clang:
7474
runs-on: ubuntu-latest
@@ -83,15 +83,15 @@ jobs:
8383
sudo add-apt-repository "deb http://apt.llvm.org/${ubuntu_codename}/ llvm-toolchain-${ubuntu_codename}-22 main" -y
8484
sudo apt-get update -q
8585
- name: Install Dependencies
86-
run: sudo apt-get install --no-install-recommends clang-22 libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev
86+
run: sudo apt-get install --no-install-recommends clang-22 libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev libiberty-dev libunwind-dev
8787
- name: Bootstrap
8888
run: ./autogen.sh
8989
- name: Configure
90-
run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities || ( cat config.log; exit 1; )
90+
run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities --enable-backtrace --enable-demangling || ( cat config.log; exit 1; )
9191
- name: Build
9292
run: make -k
9393
- name: Distcheck
94-
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities'
94+
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities --enable-backtrace --enable-demangling'
9595

9696
build-ubuntu-latest-gcc-static:
9797
runs-on: ubuntu-latest
@@ -153,11 +153,11 @@ jobs:
153153
sudo add-apt-repository "deb http://apt.llvm.org/${ubuntu_codename}/ llvm-toolchain-${ubuntu_codename}-22 main" -y
154154
sudo apt-get update -q
155155
- name: Install Dependencies
156-
run: sudo apt-get install --no-install-recommends clang-22 clang-tools-22 libncursesw5-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev
156+
run: sudo apt-get install --no-install-recommends clang-22 clang-tools-22 libncursesw5-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev libiberty-dev libunwind-dev
157157
- name: Bootstrap
158158
run: ./autogen.sh
159159
- name: Configure
160-
run: scan-build-22 -analyze-headers --status-bugs ./configure --enable-debug --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-delayacct --enable-sensors --enable-capabilities || ( cat config.log; exit 1; )
160+
run: scan-build-22 -analyze-headers --status-bugs ./configure --enable-debug --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-delayacct --enable-sensors --enable-capabilities --enable-backtrace --enable-demangling || ( cat config.log; exit 1; )
161161
- name: Build
162162
run: scan-build-22 -analyze-headers --status-bugs make -j"$(nproc)"
163163

@@ -182,11 +182,11 @@ jobs:
182182
- name: Install LLVM Toolchain
183183
run: sudo apt-get install --no-install-recommends clang-22 libclang-rt-22-dev llvm-22
184184
- name: Install Dependencies
185-
run: sudo apt-get install --no-install-recommends libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev
185+
run: sudo apt-get install --no-install-recommends libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors-dev libcap-dev libiberty-dev libunwind-dev
186186
- name: Bootstrap
187187
run: ./autogen.sh
188188
- name: Configure
189-
run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities || ( cat config.log; exit 1; )
189+
run: ./configure --enable-werror --enable-openvz --enable-vserver --enable-ancient-vserver --enable-unicode --enable-hwloc --enable-delayacct --enable-sensors --enable-capabilities --enable-backtrace --enable-demangling || ( cat config.log; exit 1; )
190190
- name: Build
191191
run: make -k
192192
- name: Run sanitized htop (1)
@@ -273,12 +273,12 @@ jobs:
273273
release: '15.0'
274274
usesh: true
275275
prepare: |
276-
pkg install -y gmake autoconf automake pkgconf git
276+
pkg install -y gmake autoconf automake pkgconf git libunwind gnulibiberty
277277
git config --global --add safe.directory /home/runner/work/htop/htop
278278
run: |
279279
set -e
280280
./autogen.sh
281-
./configure --enable-unicode --enable-werror
281+
./configure --enable-unicode --enable-werror --enable-backtrace --enable-demangling
282282
gmake -k
283283
284284
build-netbsd-latest-gcc:

Action.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ in the source distribution for its full text.
2828
#include "Macros.h"
2929
#include "MainPanel.h"
3030
#include "MemoryMeter.h"
31+
#include "Object.h"
3132
#include "OpenFilesScreen.h"
33+
#include "Panel.h"
3234
#include "Platform.h"
3335
#include "Process.h"
3436
#include "ProcessLocksScreen.h"
@@ -49,6 +51,10 @@ in the source distribution for its full text.
4951
#include "AffinityPanel.h"
5052
#endif
5153

54+
#if defined(HAVE_BACKTRACE_SCREEN)
55+
#include "BacktraceScreen.h"
56+
#endif
57+
5258

5359
Object* Action_pickFromVector(State* st, Panel* list, int x, bool follow) {
5460
MainPanel* mainPanel = st->mainPanel;
@@ -606,6 +612,35 @@ static Htop_Reaction actionShowLocks(State* st) {
606612
return HTOP_REFRESH | HTOP_REDRAW_BAR;
607613
}
608614

615+
#if defined(HAVE_BACKTRACE_SCREEN)
616+
static Htop_Reaction actionBacktrace(State *st) {
617+
Process* selectedProcess = (Process *) Panel_getSelected((Panel *)st->mainPanel);
618+
const Vector* allProcesses = st->mainPanel->super.items;
619+
620+
Vector* processes = Vector_new(Class(Process), false, VECTOR_DEFAULT_SIZE);
621+
if (!Process_isUserlandThread(selectedProcess)) {
622+
for (int i = 0; i < Vector_size(allProcesses); i++) {
623+
Process* process = (Process *)Vector_get(allProcesses, i);
624+
if (Process_getThreadGroup(process) == Process_getThreadGroup(selectedProcess)) {
625+
Vector_add(processes, process);
626+
}
627+
}
628+
} else {
629+
Vector_add(processes, selectedProcess);
630+
}
631+
632+
BacktracePanel* panel = BacktracePanel_new(processes, st->host->settings);
633+
ScreenManager* screenManager = ScreenManager_new(NULL, st->host, st, false);
634+
ScreenManager_add(screenManager, (Panel *)panel, 0);
635+
636+
ScreenManager_run(screenManager, NULL, NULL, NULL);
637+
BacktracePanel_delete((Object *)panel);
638+
ScreenManager_delete(screenManager);
639+
640+
return HTOP_REFRESH | HTOP_REDRAW_BAR | HTOP_UPDATE_PANELHDR;
641+
}
642+
#endif
643+
609644
static Htop_Reaction actionStrace(State* st) {
610645
if (!Action_writeableProcess(st))
611646
return HTOP_OK;
@@ -689,6 +724,9 @@ static const struct {
689724
{ .key = " F8 [: ", .roInactive = true, .info = "lower priority (+ nice)" },
690725
#if (defined(HAVE_LIBHWLOC) || defined(HAVE_AFFINITY))
691726
{ .key = " a: ", .roInactive = true, .info = "set CPU affinity" },
727+
#endif
728+
#if defined(HAVE_BACKTRACE_SCREEN)
729+
{ .key = " b: ", .roInactive = false, .info = "show process backtrace" },
692730
#endif
693731
{ .key = " e: ", .roInactive = false, .info = "show process environment" },
694732
{ .key = " i: ", .roInactive = true, .info = "set IO priority" },
@@ -941,6 +979,9 @@ void Action_setBindings(Htop_Action* keys) {
941979
keys['\\'] = actionIncFilter;
942980
keys[']'] = actionHigherPriority;
943981
keys['a'] = actionSetAffinity;
982+
#if defined(HAVE_BACKTRACE_SCREEN)
983+
keys['b'] = actionBacktrace;
984+
#endif
944985
keys['c'] = actionTagAllChildren;
945986
keys['e'] = actionShowEnvScreen;
946987
keys['h'] = actionHelp;

0 commit comments

Comments
 (0)