summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2021-05-16 19:55:31 +0200
committerChristian Göttsche <cgzones@googlemail.com>2021-05-16 19:55:31 +0200
commit1f5f40c091a3e91626fc39ba31d7407cbae9aa4d (patch)
tree8a642b1aaecb3284975e0205db84fb88e590c96f
parent204bc710baf145212b26a413de3c082ed9d99142 (diff)
Print current settings on crash
-rw-r--r--CRT.c8
-rw-r--r--CommandLine.c6
-rw-r--r--Settings.c24
-rw-r--r--Settings.h2
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);

© 2014-2024 Faster IT GmbH | imprint | privacy policy