diff --git a/src/parser/backtraceparsergdb.cpp b/src/parser/backtraceparsergdb.cpp --- a/src/parser/backtraceparsergdb.cpp +++ b/src/parser/backtraceparsergdb.cpp @@ -86,7 +86,11 @@ // sometimes the stack can resolve to a library even when it uses the 'at' key word. // This specifically seems to happen when a frame has no function name. const QString path = match.captured(5); - file = file && !QFileInfo(path).completeSuffix().contains(QLatin1String(".so")); + const auto completeSuffix = QFileInfo(path).completeSuffix(); + file = file + && completeSuffix != QLatin1String("so") /* libf.so (so) */ + && !completeSuffix.startsWith(QLatin1String("so.")) /* libf.so.1 (so.1) */ + && !completeSuffix.contains(QLatin1String(".so") /* libf-1.0.so.1 (0.so.1)*/); if (file) { d->m_file = match.captured(5); } else { //'from' means we have a library diff --git a/src/tests/gdbbacktracelinetest.cpp b/src/tests/gdbbacktracelinetest.cpp --- a/src/tests/gdbbacktracelinetest.cpp +++ b/src/tests/gdbbacktracelinetest.cpp @@ -65,13 +65,43 @@ // couldn't deal with the function name being missing entirely. // As a result this line used to rate as 'Good' -.- // https://bugs.kde.org/show_bug.cgi?id=416923 - BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libglib-2.0.so.0\n"); - QCOMPARE(line.type(), BacktraceLine::StackFrame); - QCOMPARE(line.frameNumber(), 13); - QCOMPARE(line.functionName(), ""); - QCOMPARE(line.fileName(), ""); - QCOMPARE(line.libraryName(), "/usr/lib/libglib-2.0.so.0"); - QCOMPARE(line.rating(), BacktraceLine::MissingSourceFile); + // https://bugs.kde.org/show_bug.cgi?id=418538 + { // glib + BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libglib-2.0.so.0\n"); + QCOMPARE(line.type(), BacktraceLine::StackFrame); + QCOMPARE(line.frameNumber(), 13); + QCOMPARE(line.functionName(), ""); + QCOMPARE(line.fileName(), ""); + QCOMPARE(line.libraryName(), "/usr/lib/libglib-2.0.so.0"); + QCOMPARE(line.rating(), BacktraceLine::MissingSourceFile); + } + { // library without -2.0 (trips up suffix detection) + BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libpackagekit-qt.so.12\n"); + QCOMPARE(line.type(), BacktraceLine::StackFrame); + QCOMPARE(line.frameNumber(), 13); + QCOMPARE(line.functionName(), ""); + QCOMPARE(line.fileName(), ""); + QCOMPARE(line.libraryName(), "/usr/lib/libpackagekit-qt.so.12"); + QCOMPARE(line.rating(), BacktraceLine::MissingSourceFile); + } + { // library without any soversion + BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libpackagekit-qt.so\n"); + QCOMPARE(line.type(), BacktraceLine::StackFrame); + QCOMPARE(line.frameNumber(), 13); + QCOMPARE(line.functionName(), ""); + QCOMPARE(line.fileName(), ""); + QCOMPARE(line.libraryName(), "/usr/lib/libpackagekit-qt.so"); + QCOMPARE(line.rating(), BacktraceLine::MissingSourceFile); + } + { // library without any soversion but name suffix + BacktraceLineGdb line("#13 0x00007fe6059971b1 in () at /usr/lib/libpackagekit-1.0.so\n"); + QCOMPARE(line.type(), BacktraceLine::StackFrame); + QCOMPARE(line.frameNumber(), 13); + QCOMPARE(line.functionName(), ""); + QCOMPARE(line.fileName(), ""); + QCOMPARE(line.libraryName(), "/usr/lib/libpackagekit-1.0.so"); + QCOMPARE(line.rating(), BacktraceLine::MissingSourceFile); + } } void testOnlyFunctionNofile()