diff --git a/api/debuggercontroller.cpp b/api/debuggercontroller.cpp index 08415362..e5e9eb8c 100644 --- a/api/debuggercontroller.cpp +++ b/api/debuggercontroller.cpp @@ -1001,7 +1001,10 @@ void DebuggerController::RemoveEventCallback(size_t index) void DebuggerController::SetDebuggerUICallbacks(DebuggerUICallbacks* cb) { - BNDebuggerSetDebuggerUICallbacks(m_object, cb->GetCallbacks(), cb); + if (cb) + BNDebuggerSetDebuggerUICallbacks(m_object, cb->GetCallbacks(), cb); + else + BNDebuggerSetDebuggerUICallbacks(m_object, nullptr, nullptr); } diff --git a/core/debuggercontroller.cpp b/core/debuggercontroller.cpp index 1713fe19..3a84d808 100644 --- a/core/debuggercontroller.cpp +++ b/core/debuggercontroller.cpp @@ -4757,7 +4757,10 @@ Ref DebuggerController::GetAdapterSettings() void DebuggerController::SetDebuggerUICallbacks(BNDebuggerUICallbacks* cb, void* ctxt) { - m_uiCallbacks = std::make_unique(cb, ctxt); + if (cb) + m_uiCallbacks = std::make_unique(cb, ctxt); + else + m_uiCallbacks.reset(); } diff --git a/ui/ui.cpp b/ui/ui.cpp index 51528e49..ec245d0b 100644 --- a/ui/ui.cpp +++ b/ui/ui.cpp @@ -1709,6 +1709,9 @@ DebuggerUI::DebuggerUI(UIContext* context, DebuggerControllerRef controller) : DebuggerUI::~DebuggerUI() { + // Unregister UI callbacks from the controller before deleting them, so the controller + // does not invoke a dangling callback if events arrive after the UI is destroyed. + m_controller->SetDebuggerUICallbacks(nullptr); if (m_uiCallbacks) { delete m_uiCallbacks;