diff --git a/qutebrowser/app.py b/qutebrowser/app.py
index dd158e7cc..5eba097cd 100644
--- a/qutebrowser/app.py
+++ b/qutebrowser/app.py
@@ -223,7 +223,7 @@ class Application(QApplication):
if data:
# Crashlog exists and has data in it, so something crashed
# previously.
- self._crashdlg = crashdialog.FatalCrashDialog(
+ self._crashdlg = crashdialog.get_fatal_crash_dialog(
self._args.debug, data)
self._crashdlg.show()
else:
diff --git a/qutebrowser/misc/crashdialog.py b/qutebrowser/misc/crashdialog.py
index 02629b6d1..586b6c704 100644
--- a/qutebrowser/misc/crashdialog.py
+++ b/qutebrowser/misc/crashdialog.py
@@ -30,10 +30,10 @@ import traceback
from PyQt5.QtCore import pyqtSlot, Qt, QSize, qVersion
from PyQt5.QtWidgets import (QDialog, QLabel, QTextEdit, QPushButton,
QVBoxLayout, QHBoxLayout, QCheckBox,
- QDialogButtonBox)
+ QDialogButtonBox, QMessageBox)
import qutebrowser
-from qutebrowser.utils import version, log, utils, objreg
+from qutebrowser.utils import version, log, utils, objreg, qtutils
from qutebrowser.misc import miscwidgets
from qutebrowser.browser.network import pastebin
from qutebrowser.config import config
@@ -63,6 +63,35 @@ def parse_fatal_stacktrace(text):
return (m.group(1), m.group(2))
+def get_fatal_crash_dialog(debug, data):
+ """Get a fatal crash dialog based on a crash log.
+
+ If the crash is a segfault in qt_mainloop and we're on an old Qt version
+ this is a simple error dialog which lets the user know they should upgrade
+ if possible.
+
+ If it's anything else, it's a normal FatalCrashDialog with the possibility
+ to report the crash.
+
+ Args:
+ debug: Whether the debug flag (--debug) was given.
+ data: The crash log data.
+ """
+ errtype, frame = parse_fatal_stacktrace(data)
+ if (qtutils.version_check('5.4') or errtype != 'Segmentation fault' or
+ frame != 'qt_mainloop'):
+ return FatalCrashDialog(debug, data)
+ else:
+ title = "qutebrowser was restarted after a fatal crash!"
+ text = ("qutebrowser was restarted after a fatal crash!
"
+ "Unfortunately, this crash occured in Qt (the library "
+ "qutebrowser uses), and your version ({}) is outdated - "
+ "Qt 5.4 or later is recommended. Unfortuntately Debian and "
+ "Ubuntu don't ship a newer version (yet?)...".format(
+ qVersion()))
+ return QMessageBox(QMessageBox.Critical, title, text, QMessageBox.Ok)
+
+
class _CrashDialog(QDialog):
"""Dialog which gets shown after there was a crash.
diff --git a/qutebrowser/qutebrowser.py b/qutebrowser/qutebrowser.py
index 29d45ac06..73d75ddec 100644
--- a/qutebrowser/qutebrowser.py
+++ b/qutebrowser/qutebrowser.py
@@ -110,7 +110,11 @@ def main():
app = app.Application(args)
def qt_mainloop():
- """Simple wrapper to get a nicer stack trace for segfaults."""
+ """Simple wrapper to get a nicer stack trace for segfaults.
+
+ WARNING: misc/crashdialog.py checks the stacktrace for this function
+ name, so if this is changed, it should be changed there as well!
+ """
return app.exec_() # pylint: disable=maybe-no-member
# We set qApp explicitely here to reduce the risk of segfaults while