From 1f5f40c091a3e91626fc39ba31d7407cbae9aa4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Sun, 16 May 2021 19:55:31 +0200 Subject: [PATCH] Print current settings on crash --- CRT.c | 8 ++++++++ CommandLine.c | 6 ++++-- Settings.c | 24 +++++++++++++++++------- Settings.h | 2 +- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/CRT.c b/CRT.c index 481e16c1..1f0a0b28 100644 --- a/CRT.c +++ b/CRT.c @@ -80,6 +80,7 @@ bool CRT_utf8 = false; const char* const* CRT_treeStr = CRT_treeStrAscii; +static const Settings* CRT_crashSettings; static const int* CRT_delay; const char* CRT_degreeSign; @@ -767,6 +768,7 @@ void CRT_init(const Settings* settings, bool allowUnicode) { initscr(); noecho(); + CRT_crashSettings = settings; CRT_delay = &(settings->delay); CRT_colors = CRT_colorSchemes[settings->colorScheme]; CRT_colorScheme = settings->colorScheme; @@ -953,6 +955,12 @@ void CRT_handleSIGSEGV(int signal) { signal, signal_str ); + fprintf(stderr, + "Setting information:\n" + "--------------------\n"); + Settings_write(CRT_crashSettings, true); + fprintf(stderr, "\n"); + #ifdef HAVE_EXECINFO_H fprintf(stderr, "Backtrace information:\n" diff --git a/CommandLine.c b/CommandLine.c index 16ded1fa..60582dcf 100644 --- a/CommandLine.c +++ b/CommandLine.c @@ -361,7 +361,7 @@ int CommandLine_run(const char* name, int argc, char** argv) { CRT_done(); if (settings->changed) { - int r = Settings_write(settings); + int r = Settings_write(settings, false); if (r < 0) fprintf(stderr, "Can not save configuration to %s: %s\n", settings->filename, strerror(-r)); } @@ -373,10 +373,12 @@ int CommandLine_run(const char* name, int argc, char** argv) { MetersPanel_cleanup(); UsersTable_delete(ut); - Settings_delete(settings); if (flags.pidMatchList) Hashtable_delete(flags.pidMatchList); + /* Delete Settings last, since it can get accessed in the crash handler */ + Settings_delete(settings); + return 0; } diff --git a/Settings.c b/Settings.c index 0606df30..92d96dd5 100644 --- a/Settings.c +++ b/Settings.c @@ -281,13 +281,20 @@ static void writeMeterModes(const Settings* this, FILE* fd, int column) { fprintf(fd, "\n"); } -int Settings_write(const Settings* this) { - FILE* fd = fopen(this->filename, "w"); - if (fd == NULL) - return -errno; +int Settings_write(const Settings* this, bool onCrash) { + FILE* fd; + if (onCrash) { + fd = stderr; + } else { + fd = fopen(this->filename, "w"); + if (fd == NULL) + return -errno; + } - fprintf(fd, "# Beware! This file is rewritten by htop when settings are changed in the interface.\n"); - fprintf(fd, "# The parser is also very primitive, and not human-friendly.\n"); + if (!onCrash) { + fprintf(fd, "# Beware! This file is rewritten by htop when settings are changed in the interface.\n"); + fprintf(fd, "# The parser is also very primitive, and not human-friendly.\n"); + } writeFields(fd, this->fields, "fields"); // This "-1" is for compatibility with the older enum format. fprintf(fd, "sort_key=%d\n", (int) this->sortKey - 1); @@ -333,6 +340,9 @@ int Settings_write(const Settings* this) { fprintf(fd, "topology_affinity=%d\n", (int) this->topologyAffinity); #endif + if (onCrash) + return 0; + int r = 0; if (ferror(fd) != 0) @@ -431,7 +441,7 @@ Settings* Settings_new(unsigned int initialCpuCount) { ok = Settings_read(this, legacyDotfile, initialCpuCount); if (ok) { // Transition to new location and delete old configuration file - if (Settings_write(this) == 0) { + if (Settings_write(this, false) == 0) { unlink(legacyDotfile); } } diff --git a/Settings.h b/Settings.h index 7313ce38..fb621adb 100644 --- a/Settings.h +++ b/Settings.h @@ -87,7 +87,7 @@ static inline int Settings_getActiveDirection(const Settings* this) { void Settings_delete(Settings* this); -int Settings_write(const Settings* this); +int Settings_write(const Settings* this, bool onCrash); Settings* Settings_new(unsigned int initialCpuCount);