mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-01-06 15:04:34 +08:00
Merge pull request #4360 from Chocobo1/signal_fix
Simplify signal handler
This commit is contained in:
commit
193913129f
@ -79,10 +79,15 @@ Q_IMPORT_PLUGIN(qico)
|
|||||||
|
|
||||||
// Signal handlers
|
// Signal handlers
|
||||||
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
||||||
void sigintHandler(int);
|
void sigNormalHandler(int signum);
|
||||||
void sigtermHandler(int);
|
void sigAbnormalHandler(int signum);
|
||||||
void sigsegvHandler(int);
|
// sys_signame[] is only defined in BSD
|
||||||
void sigabrtHandler(int);
|
const char *sysSigName[] = {
|
||||||
|
"", "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
|
||||||
|
|
||||||
struct QBtCommandLineParameters
|
struct QBtCommandLineParameters
|
||||||
@ -240,10 +245,10 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
||||||
signal(SIGABRT, sigabrtHandler);
|
signal(SIGINT, sigNormalHandler);
|
||||||
signal(SIGTERM, sigtermHandler);
|
signal(SIGTERM, sigNormalHandler);
|
||||||
signal(SIGINT, sigintHandler);
|
signal(SIGABRT, sigAbnormalHandler);
|
||||||
signal(SIGSEGV, sigsegvHandler);
|
signal(SIGSEGV, sigAbnormalHandler);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return app->exec(params.torrents);
|
return app->exec(params.torrents);
|
||||||
@ -303,58 +308,41 @@ QBtCommandLineParameters parseCommandLine()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
||||||
void sigintHandler(int)
|
void sigNormalHandler(int signum)
|
||||||
{
|
{
|
||||||
signal(SIGINT, 0);
|
|
||||||
qDebug("Catching SIGINT, exiting cleanly");
|
|
||||||
qApp->exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void sigtermHandler(int)
|
|
||||||
{
|
|
||||||
signal(SIGTERM, 0);
|
|
||||||
qDebug("Catching SIGTERM, exiting cleanly");
|
|
||||||
qApp->exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
void sigsegvHandler(int)
|
|
||||||
{
|
|
||||||
signal(SIGABRT, 0);
|
|
||||||
signal(SIGSEGV, 0);
|
|
||||||
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
std::cerr << "\n\n*************************************************************\n";
|
const char str1[] = "Catching signal: ";
|
||||||
std::cerr << "Catching SIGSEGV, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n";
|
const char *sigName = sysSigName[signum];
|
||||||
std::cerr << "qBittorrent version: " << VERSION << std::endl;
|
const char str2[] = "\nExiting cleanly\n";
|
||||||
print_stacktrace();
|
write(STDERR_FILENO, str1, strlen(str1));
|
||||||
#else
|
write(STDERR_FILENO, sigName, strlen(sigName));
|
||||||
|
write(STDERR_FILENO, str2, strlen(str2));
|
||||||
|
#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: " VERSION "\n";
|
||||||
|
write(STDERR_FILENO, str1, strlen(str1));
|
||||||
|
write(STDERR_FILENO, sigName, strlen(sigName));
|
||||||
|
write(STDERR_FILENO, str2, strlen(str2));
|
||||||
|
print_stacktrace(); // unsafe
|
||||||
|
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
||||||
#ifdef STACKTRACE_WIN
|
#ifdef STACKTRACE_WIN
|
||||||
StraceDlg dlg;
|
StraceDlg dlg; // unsafe
|
||||||
dlg.setStacktraceString(straceWin::getBacktrace());
|
dlg.setStacktraceString(straceWin::getBacktrace());
|
||||||
dlg.exec();
|
dlg.exec();
|
||||||
#endif
|
#endif // STACKTRACE_WIN
|
||||||
#endif
|
signal(signum, SIG_DFL);
|
||||||
raise(SIGSEGV);
|
raise(signum);
|
||||||
}
|
}
|
||||||
|
#endif // defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
|
||||||
void sigabrtHandler(int)
|
|
||||||
{
|
|
||||||
signal(SIGABRT, 0);
|
|
||||||
signal(SIGSEGV, 0);
|
|
||||||
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
|
|
||||||
std::cerr << "\n\n*************************************************************\n";
|
|
||||||
std::cerr << "Catching SIGABRT, please report a bug at http://bug.qbittorrent.org\nand provide the following backtrace:\n";
|
|
||||||
std::cerr << "qBittorrent version: " << VERSION << std::endl;
|
|
||||||
print_stacktrace();
|
|
||||||
#else
|
|
||||||
#ifdef STACKTRACE_WIN
|
|
||||||
StraceDlg dlg;
|
|
||||||
dlg.setStacktraceString(straceWin::getBacktrace());
|
|
||||||
dlg.exec();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
raise(SIGABRT);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
void showSplashScreen()
|
void showSplashScreen()
|
||||||
|
@ -18,6 +18,9 @@
|
|||||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifndef STACKTRACE_WIN_H
|
||||||
|
#define STACKTRACE_WIN_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <dbghelp.h>
|
#include <dbghelp.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -266,3 +269,5 @@ const QString straceWin::getBacktrace()
|
|||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#pragma optimize("g", on)
|
#pragma optimize("g", on)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif // STACKTRACE_WIN_H
|
||||||
|
@ -1,51 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2015 The qBittorrent project
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef STACKTRACE_WIN_DLG_H
|
#ifndef STACKTRACE_WIN_DLG_H
|
||||||
#define STACKTRACE_WIN_DLG_H
|
#define STACKTRACE_WIN_DLG_H
|
||||||
|
|
||||||
#include <QTextStream>
|
#include <QString>
|
||||||
#include <QClipboard>
|
#include <QDialog>
|
||||||
#include "boost/version.hpp"
|
#include "boost/version.hpp"
|
||||||
#include "libtorrent/version.hpp"
|
#include "libtorrent/version.hpp"
|
||||||
#include "ui_stacktrace_win_dlg.h"
|
#include "ui_stacktrace_win_dlg.h"
|
||||||
|
|
||||||
class StraceDlg: public QDialog, private Ui::errorDialog
|
class StraceDlg : public QDialog, private Ui::errorDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StraceDlg(QWidget* parent = 0): QDialog(parent)
|
StraceDlg(QWidget* parent = 0)
|
||||||
|
: QDialog(parent)
|
||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~StraceDlg()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void setStacktraceString(const QString& trace)
|
void setStacktraceString(const QString& trace)
|
||||||
{
|
{
|
||||||
QString htmlStr;
|
// try to call Qt function as less as possible
|
||||||
QTextStream outStream(&htmlStr);
|
const int boostVerMajor = BOOST_VERSION / 100000;
|
||||||
outStream << "<p align=center><b><font size=7 color=red>" <<
|
const int boostVerMinor = ((BOOST_VERSION / 100) % 1000);
|
||||||
"qBittorrent has crashed" <<
|
const int boostVerSubMin = BOOST_VERSION % 100;
|
||||||
"</font></b></p>" <<
|
QString htmlStr = QString(
|
||||||
"<font size=4>" <<
|
"<p align=center><b><font size=7 color=red>"
|
||||||
"<p>" <<
|
"qBittorrent has crashed"
|
||||||
"Please report a bug at <a href=\"http://bugs.qbittorrent.org\">" <<
|
"</font></b></p>"
|
||||||
"http://bugs.qbittorrent.org</a>" <<
|
"<font size=4><p>"
|
||||||
" and provide the following backtrace." <<
|
"Please file a bug report at "
|
||||||
"</p>" <<
|
"<a href=\"http://bugs.qbittorrent.org\">http://bugs.qbittorrent.org</a> "
|
||||||
"</font>" <<
|
"and provide the following information:"
|
||||||
"<br/><hr><br/>" <<
|
"</p></font>"
|
||||||
"<p align=center><font size=4>qBittorrent version: " << VERSION <<
|
"<br/><hr><br/>"
|
||||||
"<br/>Libtorrent version: " << LIBTORRENT_VERSION <<
|
"<p align=center><font size=4>"
|
||||||
"<br/>Qt version: " << QT_VERSION_STR <<
|
"qBittorrent version: " VERSION "<br/>"
|
||||||
"<br/>Boost version: " << QString::number(BOOST_VERSION / 100000) << '.' <<
|
"Libtorrent version: " LIBTORRENT_VERSION "<br/>"
|
||||||
QString::number((BOOST_VERSION / 100) % 1000) << '.' <<
|
"Qt version: " QT_VERSION_STR "<br/>"
|
||||||
QString::number(BOOST_VERSION % 100) << "</font></p><br/>"
|
"Boost version: %1.%2.%3"
|
||||||
"<pre><code>" <<
|
"</font></p><br/>"
|
||||||
trace <<
|
"<pre><code>%4</code></pre>"
|
||||||
"</code></pre>" <<
|
"<br/><hr><br/><br/>")
|
||||||
"<br/><hr><br/><br/>";
|
.arg(boostVerMajor)
|
||||||
|
.arg(boostVerMinor)
|
||||||
|
.arg(boostVerSubMin)
|
||||||
|
.arg(trace);
|
||||||
|
|
||||||
errorText->setHtml(htmlStr);
|
errorText->setHtml(htmlStr);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user