diff --git a/src/data/debuggers/internal/gdbrc b/src/data/debuggers/internal/gdbrc index e6b9eaf4..45ffe29f 100644 --- a/src/data/debuggers/internal/gdbrc +++ b/src/data/debuggers/internal/gdbrc @@ -1,78 +1,78 @@ [General] Name=gdb Name[ast]=gdb Name[bg]=gdb Name[bn]=gdb Name[bs]=gDB Name[ca]=gdb Name[ca@valencia]=gdb Name[cs]=gdb Name[csb]=gdb Name[da]=gdb Name[de]=gdb Name[el]=gdb Name[en_GB]=gdb Name[eo]=gdb Name[es]=gdb Name[et]=gdb Name[eu]=gdb Name[fa]=gdb Name[fi]=gdb Name[fr]=gdb Name[fy]=gdb Name[ga]=gdb Name[gl]=gdb Name[gu]=gdb Name[he]=gdb Name[hi]=gdb Name[hr]=gdb Name[hu]=gdb Name[ia]=gdb Name[id]=gdb Name[is]=gdb Name[it]=gdb Name[ka]=gdb Name[kk]=gdb Name[km]=gdb Name[kn]=gdb Name[ko]=gdb Name[lt]=gdb Name[lv]=gdb Name[mai]=gdb Name[mk]=gdb Name[ml]=ജിഡിബി Name[mr]=gdb Name[nb]=gdb Name[nds]=GDB Name[nl]=gdb Name[nn]=gdb Name[pa]=gdb Name[pl]=gdb Name[pt]=gdb Name[pt_BR]=gdb Name[ro]=gdb Name[ru]=gdb Name[si]=gdb Name[sk]=gdb Name[sl]=gdb Name[sr]=ГДБ Name[sr@ijekavian]=ГДБ Name[sr@ijekavianlatin]=GDB Name[sr@latin]=GDB Name[sv]=gdb Name[tg]=gdb Name[th]=gdb Name[tr]=gdb Name[ug]=gdb Name[uk]=gdb Name[vi]=gdb Name[wa]=gdb Name[x-test]=xxgdbxx Name[zh_CN]=gdb Name[zh_TW]=gdb TryExec=gdb Backends=KCrash [KCrash] Exec=gdb -nw -n -batch -x %tempfile -p %pid %execpath -BatchCommands=set width 200\nthread\nthread apply all bt +BatchCommands=set width 200\nprint "Content of s_kcrashErrorMessage:"\nprint s_kcrashErrorMessage.constData()\nthread\nthread apply all bt diff --git a/src/data/debuggers/internal/lldbrc b/src/data/debuggers/internal/lldbrc index 0338b9d2..20068f97 100644 --- a/src/data/debuggers/internal/lldbrc +++ b/src/data/debuggers/internal/lldbrc @@ -1,41 +1,41 @@ [General] Name=lldb Name[ast]=lldb Name[ca]=lldb Name[ca@valencia]=lldb Name[cs]=lldb Name[da]=lldb Name[de]=lldb Name[en_GB]=lldb Name[es]=lldb Name[et]=lldb Name[eu]=lldb Name[fi]=lldb Name[fr]=lldb Name[gl]=lldb Name[hu]=lldb Name[ia]=lldb Name[id]=lldb Name[it]=lldb Name[ko]=lldb Name[lt]=lldb Name[nl]=lldb Name[nn]=lldb Name[pl]=lldb Name[pt]=lldb Name[pt_BR]=lldb Name[ru]=lldb Name[sk]=lldb Name[sv]=lldb Name[tg]=lldb Name[uk]=lldb Name[x-test]=xxlldbxx Name[zh_CN]=lldb Name[zh_TW]=lldb TryExec=lldb Backends=KCrash [KCrash] Exec=lldb -p %pid ExecInputFile=%tempfile -BatchCommands=settings set term-width 200\nthread info\nbt all\ndetach +BatchCommands=settings set term-width 200\nprint "Content of s_kcrashErrorMessage:"\nprint s_kcrashErrorMessage.constData()\nthread info\nbt all\ndetach diff --git a/src/tests/crashtest/crashtest.cpp b/src/tests/crashtest/crashtest.cpp index 972d1858..b1d6062a 100644 --- a/src/tests/crashtest/crashtest.cpp +++ b/src/tests/crashtest/crashtest.cpp @@ -1,162 +1,172 @@ /***************************************************************** * drkonqi - The KDE Crash Handler * * Copyright (C) 2000-2002 David Faure * Copyright (C) 2000-2002 Waldo Bastian * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************/ // Let's crash. #include #include #include #include #include #include #include #include -enum CrashType { Crash, Malloc, Div0, Assert, QAssert, Threads }; +enum CrashType { Crash, Malloc, Div0, Assert, QAssert, Threads, FatalErrorMessage }; struct SomeStruct { int foo() { return ret; } int ret; }; void do_crash() { SomeStruct *obj = nullptr; int ret = obj->foo(); printf("result = %d\n", ret); } void do_malloc() { delete (char*)0xdead; } void do_div0() { volatile int a = 99; volatile int b = 10; volatile int c = a / ( b - 10 ); printf("result = %d\n", c); } void do_assert() { assert(false); } void do_qassert() { Q_ASSERT(false); } void map_function(const QString & s) { while ( s != QLatin1String("thread 4") ) {} do_crash(); } void do_threads() { QStringList foo; foo << QStringLiteral("thread 1") << QStringLiteral("thread 2") << QStringLiteral("thread 3") << QStringLiteral("thread 4") << QStringLiteral("thread 5"); QThreadPool::globalInstance()->setMaxThreadCount(5); QtConcurrent::blockingMap(foo, map_function); } +void do_fatalErrorMessage() +{ + KCrash::setErrorMessage(QStringLiteral("So long, my friends...")); + qFatal("So long!\n"); +} + void level4(int t) { if (t == Malloc) do_malloc(); else if (t == Div0) do_div0(); else if (t == Assert) do_assert(); else if (t == QAssert) do_qassert(); else if (t == Threads) do_threads(); + else if (t == FatalErrorMessage) + do_fatalErrorMessage(); else do_crash(); } void level3(int t) { level4(t); } void level2(int t) { level3(t); } void level1(int t) { level2(t); } int main(int argc, char *argv[]) { QApplication app(argc, argv); KAboutData aboutData(QStringLiteral("crashtext"), i18n("Crash Test for DrKonqi"), QStringLiteral("1.1"), i18n("Crash Test for DrKonqi"), KAboutLicense::GPL, i18n("(c) 2000-2002 David Faure, Waldo Bastian")); QCommandLineParser parser; parser.addOption(QCommandLineOption(QStringLiteral("autorestart"), i18n("Automatically restart"))); parser.addOption(QCommandLineOption(QStringLiteral("kdeinit"), i18n("Start DrKonqi using kdeinit"))); - parser.addPositionalArgument(QStringLiteral("type"), i18n("Type of crash."), QStringLiteral("crash|malloc|div0|assert|threads")); + parser.addPositionalArgument(QStringLiteral("type"), i18n("Type of crash."), QStringLiteral("crash|malloc|div0|assert|threads|fatal")); aboutData.setupCommandLine(&parser); parser.process(app); aboutData.processCommandLine(&parser); // Start drkonqi directly by default so that drkonqi's output goes to the console. KCrash::CrashFlags flags = KCrash::AlwaysDirectly; // This can be disabled to be able to test kcrash's real default behavior. if (parser.isSet(QStringLiteral("kdeinit"))) flags &= ~KCrash::AlwaysDirectly; if (parser.isSet(QStringLiteral("autorestart"))) flags |= KCrash::AutoRestart; KCrash::setFlags(flags); QByteArray type = parser.positionalArguments().isEmpty() ? QByteArray() : parser.positionalArguments().first().toUtf8(); int crashtype = Crash; if (type == "malloc") crashtype = Malloc; else if (type == "div0") crashtype = Div0; else if (type == "assert") crashtype = Assert; else if (type == "qassert") crashtype = QAssert; else if (type == "threads") crashtype = Threads; + else if (type == "fatal") + crashtype = FatalErrorMessage; level1(crashtype); return app.exec(); }