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

            Bug ID: 425991
           Summary: Crash in BreakpointModel::updateState() 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, depending on the relative
timing of KDevelop exit and the 5 second interval of the singleshot timer in
MIDebugSession::stopDebugger(), a DebugSession may be destroyed safely in time
or not destroyed at all and possibly cause a crash by accessing the already
destroyed DebugController or its children. A DebugSession's state transition
signals lead to accesses to DebugController and its children, such as a call to
BreakpointModel::updateState(). Even though
IBreakpointController::breakpointModel() returns nullptr when ICore::self() is
nullptr, IBreakpointController::updateState() doesn't check for it. That is why
this=0x0 in BreakpointModel::updateState() in the backtrace below.

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  0x00007f38447fd190 in QScopedPointer<KDevelop::BreakpointModelPrivate,
QScopedPointerDeleter<KDevelop::BreakpointModelPrivate> >::operator->() const
(this=0x10) at /usr/include/qt/QtCore/qscopedpointer.h:118
#5  0x00007f38447fc57b 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  0x00007f38447fc442 in KDevelop::BreakpointModel::d_func() (this=0x0) at
../kdevplatform/debugger/breakpoint/breakpointmodel.h:198
#7  0x00007f38447f9b3e in KDevelop::BreakpointModel::updateState(int,
KDevelop::Breakpoint::BreakpointState) (this=0x0, row=0,
state=KDevelop::Breakpoint::NotStartedState) at
../kdevplatform/debugger/breakpoint/breakpointmodel.cpp:326
#8  0x00007f38447e4fcd in KDevelop::IBreakpointController::updateState(int,
KDevelop::Breakpoint::BreakpointState) (this=0x55c5920a9f10, row=0,
state=KDevelop::Breakpoint::NotStartedState) at
../kdevplatform/debugger/interfaces/ibreakpointcontroller.cpp:61
#9  0x00007f37d2b7800b in
KDevMI::MIBreakpointController::debuggerStateChanged(KDevelop::IDebugSession::DebuggerState)
(this=0x55c5920a9f10, state=KDevelop::IDebugSession::EndedState) at
../plugins/debuggercommon/mibreakpointcontroller.cpp:301
#10 0x00007f38447e7dea in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>,
QtPrivate::List<KDevelop::IDebugSession::DebuggerState>, void, void
(KDevelop::IBreakpointController::*)(KDevelop::IDebugSession::DebuggerState)>::call(void
(KDevelop::IBreakpointController::*)(KDevelop::IDebugSession::DebuggerState),
KDevelop::IBreakpointController*, void**) (f=&virtual table offset 120,
o=0x55c5920a9f10, arg=0x7ffe806e5750) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:152
#11 0x00007f38447e799b in QtPrivate::FunctionPointer<void
(KDevelop::IBreakpointController::*)(KDevelop::IDebugSession::DebuggerState)>::call<QtPrivate::List<KDevelop::IDebugSession::DebuggerState>,
void>(void
(KDevelop::IBreakpointController::*)(KDevelop::IDebugSession::DebuggerState),
KDevelop::IBreakpointController*, void**) (f=&virtual table offset 120,
o=0x55c5920a9f10, arg=0x7ffe806e5750) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:185
#12 0x00007f38447e72bc in QtPrivate::QSlotObject<void
(KDevelop::IBreakpointController::*)(KDevelop::IDebugSession::DebuggerState),
QtPrivate::List<KDevelop::IDebugSession::DebuggerState>, void>::impl(int,
QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1,
this_=0x55c5a684ba10, r=0x55c5920a9f10, a=0x7ffe806e5750, ret=0x0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:418
#13 0x00007f3845036a26 in  () at /usr/lib/libQt5Core.so.5
#14 0x00007f38447e3c27 in
KDevelop::IDebugSession::stateChanged(KDevelop::IDebugSession::DebuggerState)
(this=0x55c5c0f70b30, _t1=KDevelop::IDebugSession::EndedState) at
kdevplatform/debugger/KDevPlatformDebugger_autogen/include/moc_idebugsession.cpp:284
#15 0x00007f37d2b65243 in
KDevMI::MIDebugSession::setSessionState(KDevelop::IDebugSession::DebuggerState)
(this=0x55c5c0f70b30, state=KDevelop::IDebugSession::EndedState) at
../plugins/debuggercommon/midebugsession.cpp:369
#16 0x00007f37d2b661e7 in
KDevMI::MIDebugSession::handleDebuggerStateChange(QFlags<KDevMI::DBGStateFlag>,
QFlags<KDevMI::DBGStateFlag>) (this=0x55c5c0f70b30, oldState=..., newState=...)
at ../plugins/debuggercommon/midebugsession.cpp:499
#17 0x00007f37d2b65506 in
KDevMI::MIDebugSession::setDebuggerState(QFlags<KDevMI::DBGStateFlag>)
(this=0x55c5c0f70b30, newState=...) at
../plugins/debuggercommon/midebugsession.cpp:410
#18 0x00007f37d2b665d8 in operator()() const (__closure=0x55c5b06343f0) at
../plugins/debuggercommon/midebugsession.cpp:567
#19 0x00007f37d2b6be54 in QtPrivate::FunctorCall<QtPrivate::IndexesList<>,
QtPrivate::List<>, void, KDevMI::MIDebugSession::stopDebugger()::<lambda()>
>::call(struct {...} &, void **) (f=..., arg=0x7ffe806e5a00) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:146
#20 0x00007f37d2b6be26 in
QtPrivate::Functor<KDevMI::MIDebugSession::stopDebugger()::<lambda()>,
0>::call<QtPrivate::List<>, void>(struct {...} &, void *, void **) (f=...,
arg=0x7ffe806e5a00) at /usr/include/qt/QtCore/qobjectdefs_impl.h:256
#21 0x00007f37d2b6bd8f in
QtPrivate::QFunctorSlotObject<KDevMI::MIDebugSession::stopDebugger()::<lambda()>,
0, QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase *, QObject *,
void **, bool *) (which=1, this_=0x55c5b06343e0, r=0x55c5c0f70b30,
a=0x7ffe806e5a00, ret=0x0) at /usr/include/qt/QtCore/qobjectdefs_impl.h:443
#22 0x00007f384503ab33 in  () at /usr/lib/libQt5Core.so.5
#23 0x00007f384502c10f in QObject::event(QEvent*) () at
/usr/lib/libQt5Core.so.5
#24 0x00007f3845e83702 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
() at /usr/lib/libQt5Widgets.so.5
#25 0x00007f3844fff7ba in QCoreApplication::notifyInternal2(QObject*, QEvent*)
() at /usr/lib/libQt5Core.so.5
#26 0x00007f38450576b5 in QTimerInfoList::activateTimers() () at
/usr/lib/libQt5Core.so.5
#27 0x00007f3845057f62 in  () at /usr/lib/libQt5Core.so.5
#28 0x00007f3842eed43c in g_main_context_dispatch () at
/usr/lib/libglib-2.0.so.0
#29 0x00007f3842f3b1d9 in  () at /usr/lib/libglib-2.0.so.0
#30 0x00007f3842eec221 in g_main_context_iteration () at
/usr/lib/libglib-2.0.so.0
#31 0x00007f3845058331 in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
at /usr/lib/libQt5Core.so.5
#32 0x00007f3844ffe13c in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at
/usr/lib/libQt5Core.so.5
#33 0x00007f38450065c4 in QCoreApplication::exec() () at
/usr/lib/libQt5Core.so.5
#34 0x000055c5701b267c in main(int, char**) (argc=3, argv=0x7ffe806e6218) at
../app/main.cpp:850
[Inferior 1 (process 15477) detached]

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

Reply via email to