Skip to content

Commit

Permalink
Merge pull request qbittorrent#7667 from Chocobo1/stackdump
Browse files Browse the repository at this point in the history
Include & print caught signal in stackdump
  • Loading branch information
Chocobo1 authored Nov 4, 2017
2 parents 7b95785 + 21bc08d commit 04cec39
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 24 deletions.
35 changes: 21 additions & 14 deletions src/app/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -276,32 +283,32 @@ 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
}

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);
Expand Down
2 changes: 1 addition & 1 deletion src/app/stacktrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<void *> addrlist(max_frames + 1);
Expand Down
20 changes: 11 additions & 9 deletions src/app/stacktrace_win_dlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -68,14 +68,16 @@ class StraceDlg : public QDialog, private Ui::errorDialog
"Libtorrent version: %1<br/>"
"Qt version: " QT_VERSION_STR "<br/>"
"Boost version: %2<br/>"
"OS version: %3"
"</font></p><br/>"
"<pre><code>%4</code></pre>"
"OS version: %3<br/><br/>"
"Caught signal: %4"
"</font></p>"
"<pre><code>%5</code></pre>"
"<br/><hr><br/><br/>")
.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);
}
Expand Down

0 comments on commit 04cec39

Please sign in to comment.