https://bugs.kde.org/show_bug.cgi?id=425993

            Bug ID: 425993
           Summary: Crash in BreakpointModel::breakpoint() when exiting
                    KDevelop while debugging a program
           Product: kdevelop
           Version: git master
          Platform: Compiled Sources
                OS: Linux
            Status: REPORTED
          Severity: crash
          Priority: NOR
         Component: CPP Debugger
          Assignee: kdevelop-bugs-n...@kde.org
          Reporter: igor...@gmail.com
                CC: niko.s...@gmail.com
  Target Milestone: ---

SUMMARY
When a user exits KDevelop while debugging a program, a queued call to
MIDebugger::readyReadStandardOutput() may be invoked during or after
~CorePrivate(). If this happens after ~DebugController() (which is the parent
of BreakpointModel), a crash is likely, because readyReadStandardOutput()
indirectly calls MIBreakpointController::updateFromDebugger(), which assumes
that BreakpointModel is not null (as do all other MIBreakpointController's
member functions).

SOFTWARE/OS VERSIONS
Manjaro GNU/Linux, Xfce
KDE Frameworks Version: 5.73.0
Qt Version: 5.15.0

ADDITIONAL INFORMATION
I am going to create a Merge Request with a fix soon.

BACKTRACE (Debug)
Application: KDevelop (kdevelop), signal: Segmentation fault

[KCrash Handler]
#4  0x00007fd07528f340 in QScopedPointer<KDevelop::BreakpointModelPrivate,
QScopedPointerDeleter<KDevelop::BreakpointModelPrivate> >::operator->() const
(this=0x10) at /usr/include/qt/QtCore/qscopedpointer.h:118
#5  0x00007fd07528e72b in
qGetPtrHelper<QScopedPointer<KDevelop::BreakpointModelPrivate,
QScopedPointerDeleter<KDevelop::BreakpointModelPrivate> >
const>(QScopedPointer<KDevelop::BreakpointModelPrivate,
QScopedPointerDeleter<KDevelop::BreakpointModelPrivate> > const&) (ptr=...) at
/usr/include/qt/QtCore/qglobal.h:1133
#6  0x00007fd07528e602 in KDevelop::BreakpointModel::d_func() const (this=0x0)
at ../kdevplatform/debugger/breakpoint/breakpointmodel.h:198
#7  0x00007fd07528d5f9 in KDevelop::BreakpointModel::breakpoint(int) const
(this=0x0, row=2) at
../kdevplatform/debugger/breakpoint/breakpointmodel.cpp:622
#8  0x00007fd005a7e5ab in
KDevMI::MIBreakpointController::updateFromDebugger(int, KDevMI::MI::Value
const&, QFlags<KDevelop::BreakpointModel::ColumnFlag>) (this=0x55a769ef2000,
row=2, miBkpt=..., lockedColumns=...) at
../plugins/debuggercommon/mibreakpointcontroller.cpp:653
#9  0x00007fd005a81310 in
KDevMI::MIBreakpointController::InsertedHandler::handle(KDevMI::MI::ResultRecord
const&) (this=0x55a76a6526b0, r=...) at
../plugins/debuggercommon/mibreakpointcontroller.cpp:140
#10 0x00007fd005a5dfd9 in
KDevMI::MI::MICommand::invokeHandler(KDevMI::MI::ResultRecord const&)
(this=0x55a76485e000, r=...) at ../plugins/debuggercommon/mi/micommand.cpp:111
#11 0x00007fd005a624e0 in KDevMI::MIDebugger::processLine(QByteArray const&)
(this=0x55a769d389a0, line=...) at ../plugins/debuggercommon/midebugger.cpp:224
#12 0x00007fd005a619e7 in KDevMI::MIDebugger::readyReadStandardOutput()
(this=0x55a769d389a0) at ../plugins/debuggercommon/midebugger.cpp:147
#13 0x00007fd005a65231 in QtPrivate::FunctorCall<QtPrivate::IndexesList<>,
QtPrivate::List<>, void, void (KDevMI::MIDebugger::*)()>::call(void
(KDevMI::MIDebugger::*)(), KDevMI::MIDebugger*, void**) (f=(void
(KDevMI::MIDebugger::*)(KDevMI::MIDebugger * const)) 0x7fd005a6190a
<KDevMI::MIDebugger::readyReadStandardOutput()>, o=0x55a769d389a0,
arg=0x7fff84c18200) at /usr/include/qt/QtCore/qobjectdefs_impl.h:152
#14 0x00007fd005a64e1c in QtPrivate::FunctionPointer<void
(KDevMI::MIDebugger::*)()>::call<QtPrivate::List<>, void>(void
(KDevMI::MIDebugger::*)(), KDevMI::MIDebugger*, void**) (f=(void
(KDevMI::MIDebugger::*)(KDevMI::MIDebugger * const)) 0x7fd005a6190a
<KDevMI::MIDebugger::readyReadStandardOutput()>, o=0x55a769d389a0,
arg=0x7fff84c18200) at /usr/include/qt/QtCore/qobjectdefs_impl.h:185
#15 0x00007fd005a6489e in QtPrivate::QSlotObject<void
(KDevMI::MIDebugger::*)(), QtPrivate::List<>, void>::impl(int,
QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1,
this_=0x55a769ccb270, r=0x55a769d389a0, a=0x7fff84c18200, ret=0x0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:418
#16 0x00007fd075acfa26 in QtPrivate::QSlotObjectBase::call(QObject*, void**)
(a=0x7fff84c18200, r=0x55a769d389a0, this=0x55a769ccb270) at
../../include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:398
#17 doActivate<false>(QObject*, int, void**) (sender=0x55a76a577d70,
signal_index=15, argv=argv@entry=0x7fff84c18200) at kernel/qobject.cpp:3886
#18 0x00007fd075ac8bc0 in QMetaObject::activate(QObject*, QMetaObject const*,
int, void**) (sender=<optimized out>, m=m@entry=0x7fd075d2cda0
<QProcess::staticMetaObject>, local_signal_index=local_signal_index@entry=6,
argv=argv@entry=0x7fff84c18200) at kernel/qobject.cpp:3946
#19 0x00007fd075a0430e in
QProcess::readyReadStandardOutput(QProcess::QPrivateSignal) (this=<optimized
out>, _t1=...) at .moc/moc_qprocess.cpp:367
#20 0x00007fd075a09a56 in
QProcessPrivate::tryReadFromChannel(QProcessPrivate::Channel*)
(this=0x55a769b86ef0, channel=0x55a769b87000) at io/qprocess.cpp:1057
#21 0x00007fd075a09fb5 in QProcessPrivate::_q_canReadStandardError()
(this=<optimized out>) at io/qprocess.cpp:1084
#22 QProcess::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
(_o=<optimized out>, _c=<optimized out>, _id=<optimized out>,
_a=0x7fff84c183b0) at .moc/moc_qprocess.cpp:210
#23 0x00007fd075acfa60 in doActivate<false>(QObject*, int, void**)
(sender=0x55a76a56dd00, signal_index=3, argv=argv@entry=0x7fff84c183b0) at
../../include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:395
#24 0x00007fd075ac8bc0 in QMetaObject::activate(QObject*, QMetaObject const*,
int, void**) (sender=sender@entry=0x55a76a56dd00, m=m@entry=0x7fd075d2f180
<QSocketNotifier::staticMetaObject>,
local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x7fff84c183b0)
at kernel/qobject.cpp:3946
#25 0x00007fd075ad2f90 in QSocketNotifier::activated(QSocketDescriptor,
QSocketNotifier::Type, QSocketNotifier::QPrivateSignal)
(this=this@entry=0x55a76a56dd00, _t1=..., _t2=<optimized out>, _t3=...) at
.moc/moc_qsocketnotifier.cpp:178
#26 0x00007fd075ad379d in QSocketNotifier::event(QEvent*) (this=0x55a76a56dd00,
e=0x7fff84c184c0) at kernel/qsocketnotifier.cpp:302
#27 0x00007fd076923702 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
(this=<optimized out>, receiver=0x55a76a56dd00, e=0x7fff84c184c0) at
kernel/qapplication.cpp:3671
#28 0x00007fd075a987ba in QCoreApplication::notifyInternal2(QObject*, QEvent*)
(receiver=0x55a76a56dd00, event=0x7fff84c184c0) at
../../include/QtCore/5.15.0/QtCore/private/../../../../../src/corelib/thread/qthread_p.h:325
#29 0x00007fd075af1f46 in socketNotifierSourceDispatch(GSource*, GSourceFunc,
gpointer) (source=0x55a75f257d90) at kernel/qeventdispatcher_glib.cpp:107
#30 0x00007fd071e5743c in g_main_context_dispatch () at
/usr/lib/libglib-2.0.so.0
#31 0x00007fd071ea51d9 in  () at /usr/lib/libglib-2.0.so.0
#32 0x00007fd071e56221 in g_main_context_iteration () at
/usr/lib/libglib-2.0.so.0
#33 0x00007fd075af1331 in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
(this=0x55a75f1aa9f0, flags=...) at kernel/qeventdispatcher_glib.cpp:423
#34 0x00007fd075a9713c in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)
(this=this@entry=0x7fff84c186d0, flags=..., flags@entry=...) at
../../include/QtCore/../../src/corelib/global/qflags.h:141
#35 0x00007fd075a9f5c4 in QCoreApplication::exec() () at
../../include/QtCore/../../src/corelib/global/qflags.h:121
#36 0x000055a75e51c81f in main(int, char**) (argc=3, argv=0x7fff84c18b48) at
../app/main.cpp:850
[Inferior 1 (process 129648) detached]

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to