From 21bc08d643f56a5cd4afcfdb2f90b6a5f01c32a8 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 25 Oct 2017 18:49:30 +0800 Subject: [PATCH] Include/print caught signal in stackdump --- src/app/main.cpp | 35 +++++++++++++++++++++-------------- src/app/stacktrace.h | 2 +- src/app/stacktrace_win_dlg.h | 20 +++++++++++--------- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index b42fec742..7a1a8c9b0 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -84,10 +84,17 @@ void sigNormalHandler(int signum); void sigAbnormalHandler(int signum); // sys_signame[] is only defined in BSD const char *sysSigName[] = { +#if defined(Q_OS_WIN) + "", "", "SIGINT", "", "SIGILL", "", "SIGABRT_COMPAT", "", "SIGFPE", "", + "", "SIGSEGV", "", "", "", "SIGTERM", "", "", "", "", + "", "SIGBREAK", "SIGABRT", "", "", "", "", "", "", "", + "", "" +#else "", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL", "SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP", "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO", "SIGPWR", "SIGUNUSED" +#endif }; #endif @@ -214,7 +221,7 @@ int main(int argc, char *argv[]) QByteArray path = "/usr/local/bin:"; path += qgetenv("PATH"); qputenv("PATH", path.constData()); - + // On OS X the standard is to not show icons in the menus app->setAttribute(Qt::AA_DontShowIconsInMenus); #endif @@ -276,12 +283,11 @@ void reportToUser(const char* str) void sigNormalHandler(int signum) { #if !defined Q_OS_WIN && !defined Q_OS_HAIKU - const char str1[] = "Catching signal: "; - const char *sigName = sysSigName[signum]; - const char str2[] = "\nExiting cleanly\n"; - reportToUser(str1); - reportToUser(sigName); - reportToUser(str2); + const char msg1[] = "Catching signal: "; + const char msg2[] = "\nExiting cleanly\n"; + reportToUser(msg1); + reportToUser(sysSigName[signum]); + reportToUser(msg2); #endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU signal(signum, SIG_DFL); qApp->exit(); // unsafe, but exit anyway @@ -289,19 +295,20 @@ void sigNormalHandler(int signum) void sigAbnormalHandler(int signum) { -#if !defined Q_OS_WIN && !defined Q_OS_HAIKU - const char str1[] = "\n\n*************************************************************\nCatching signal: "; const char *sigName = sysSigName[signum]; - const char str2[] = "\nPlease file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n" - "qBittorrent version: " QBT_VERSION "\n"; - reportToUser(str1); +#if !defined Q_OS_WIN && !defined Q_OS_HAIKU + const char msg[] = "\n\n*************************************************************\n" + "Please file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n" + "qBittorrent version: " QBT_VERSION "\n\n" + "Caught signal: "; + reportToUser(msg); reportToUser(sigName); - reportToUser(str2); + reportToUser("\n"); print_stacktrace(); // unsafe #endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU #ifdef STACKTRACE_WIN StraceDlg dlg; // unsafe - dlg.setStacktraceString(straceWin::getBacktrace()); + dlg.setStacktraceString(QLatin1String(sigName), straceWin::getBacktrace()); dlg.exec(); #endif // STACKTRACE_WIN signal(signum, SIG_DFL); diff --git a/src/app/stacktrace.h b/src/app/stacktrace.h index 4bcccf859..78a177f13 100644 --- a/src/app/stacktrace.h +++ b/src/app/stacktrace.h @@ -14,7 +14,7 @@ /** Print a demangled stack backtrace of the caller function to FILE* out. */ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63) { - fprintf(out, "stack trace:\n"); + fprintf(out, "Stack trace:\n"); // storage array for stack trace address data std::vector addrlist(max_frames + 1); diff --git a/src/app/stacktrace_win_dlg.h b/src/app/stacktrace_win_dlg.h index e9e7ff307..9ba2ca0fc 100644 --- a/src/app/stacktrace_win_dlg.h +++ b/src/app/stacktrace_win_dlg.h @@ -40,13 +40,13 @@ class StraceDlg : public QDialog, private Ui::errorDialog Q_OBJECT public: - StraceDlg(QWidget* parent = 0) + StraceDlg(QWidget *parent = nullptr) : QDialog(parent) { setupUi(this); } - void setStacktraceString(const QString& trace) + void setStacktraceString(const QString &sigName, const QString &trace) { // try to call Qt function as less as possible QString htmlStr = QString( @@ -68,14 +68,16 @@ public: "Libtorrent version: %1
" "Qt version: " QT_VERSION_STR "
" "Boost version: %2
" - "OS version: %3" - "


" - "
%4
" + "OS version: %3

" + "Caught signal: %4" + "

" + "
%5
" "



") - .arg(Utils::Misc::libtorrentVersionString()) - .arg(Utils::Misc::boostVersionString()) - .arg(Utils::Misc::osName()) - .arg(trace); + .arg(Utils::Misc::libtorrentVersionString()) + .arg(Utils::Misc::boostVersionString()) + .arg(Utils::Misc::osName()) + .arg(sigName) + .arg(trace); errorText->setHtml(htmlStr); }