@@ -534,6 +534,7 @@ bool DebuggerBreakpoints::AddAbsolute(uint64_t remoteAddress)
534534 {
535535 ModuleNameAndOffset info = m_state->GetModules ()->AbsoluteAddressToRelative (remoteAddress);
536536 m_breakpoints.push_back (info);
537+ m_enabledState[info] = true ; // Enable by default
537538 SerializeMetadata ();
538539 }
539540
@@ -546,6 +547,7 @@ bool DebuggerBreakpoints::AddOffset(const ModuleNameAndOffset& address)
546547 if (!ContainsOffset (address))
547548 {
548549 m_breakpoints.push_back (address);
550+ m_enabledState[address] = true ; // Enable by default
549551 SerializeMetadata ();
550552
551553 // If the adapter is already created, we ask it to add the breakpoint.
@@ -574,6 +576,7 @@ bool DebuggerBreakpoints::RemoveAbsolute(uint64_t remoteAddress)
574576 {
575577 m_breakpoints.erase (iter);
576578 }
579+ m_enabledState.erase (info); // Remove enabled state
577580 SerializeMetadata ();
578581 m_state->GetAdapter ()->RemoveBreakpoint (remoteAddress);
579582 return true ;
@@ -589,6 +592,7 @@ bool DebuggerBreakpoints::RemoveOffset(const ModuleNameAndOffset& address)
589592 if (auto iter = std::find (m_breakpoints.begin (), m_breakpoints.end (), address); iter != m_breakpoints.end ())
590593 m_breakpoints.erase (iter);
591594
595+ m_enabledState.erase (address); // Remove enabled state
592596 SerializeMetadata ();
593597
594598 if (m_state->GetAdapter () && m_state->IsConnected ())
@@ -603,6 +607,76 @@ bool DebuggerBreakpoints::RemoveOffset(const ModuleNameAndOffset& address)
603607}
604608
605609
610+ bool DebuggerBreakpoints::EnableAbsolute (uint64_t remoteAddress)
611+ {
612+ ModuleNameAndOffset info = m_state->GetModules ()->AbsoluteAddressToRelative (remoteAddress);
613+ return EnableOffset (info);
614+ }
615+
616+
617+ bool DebuggerBreakpoints::EnableOffset (const ModuleNameAndOffset& address)
618+ {
619+ if (!ContainsOffset (address))
620+ return false ;
621+
622+ m_enabledState[address] = true ;
623+ SerializeMetadata ();
624+
625+ // If connected, make sure the breakpoint is active in the target
626+ if (m_state->GetAdapter () && m_state->IsConnected ())
627+ {
628+ uint64_t remoteAddress = m_state->GetModules ()->RelativeAddressToAbsolute (address);
629+ m_state->GetAdapter ()->AddBreakpoint (remoteAddress);
630+ return true ;
631+ }
632+ return true ;
633+ }
634+
635+
636+ bool DebuggerBreakpoints::DisableAbsolute (uint64_t remoteAddress)
637+ {
638+ ModuleNameAndOffset info = m_state->GetModules ()->AbsoluteAddressToRelative (remoteAddress);
639+ return DisableOffset (info);
640+ }
641+
642+
643+ bool DebuggerBreakpoints::DisableOffset (const ModuleNameAndOffset& address)
644+ {
645+ if (!ContainsOffset (address))
646+ return false ;
647+
648+ m_enabledState[address] = false ;
649+ SerializeMetadata ();
650+
651+ // If connected, remove the breakpoint from the target but keep it in our list
652+ if (m_state->GetAdapter () && m_state->IsConnected ())
653+ {
654+ uint64_t remoteAddress = m_state->GetModules ()->RelativeAddressToAbsolute (address);
655+ m_state->GetAdapter ()->RemoveBreakpoint (remoteAddress);
656+ return true ;
657+ }
658+ return true ;
659+ }
660+
661+
662+ bool DebuggerBreakpoints::IsEnabledAbsolute (uint64_t address)
663+ {
664+ ModuleNameAndOffset info = m_state->GetModules ()->AbsoluteAddressToRelative (address);
665+ return IsEnabledOffset (info);
666+ }
667+
668+
669+ bool DebuggerBreakpoints::IsEnabledOffset (const ModuleNameAndOffset& address)
670+ {
671+ auto iter = m_enabledState.find (address);
672+ if (iter != m_enabledState.end ())
673+ return iter->second ;
674+
675+ // Default to enabled if not explicitly set
676+ return true ;
677+ }
678+
679+
606680bool DebuggerBreakpoints::ContainsOffset (const ModuleNameAndOffset& address)
607681{
608682 // If there is no backend, then only check if the breakpoint is in the list
@@ -980,6 +1054,30 @@ void DebuggerState::DeleteBreakpoint(const ModuleNameAndOffset& address)
9801054}
9811055
9821056
1057+ void DebuggerState::EnableBreakpoint (uint64_t address)
1058+ {
1059+ m_breakpoints->EnableAbsolute (address);
1060+ }
1061+
1062+
1063+ void DebuggerState::EnableBreakpoint (const ModuleNameAndOffset& address)
1064+ {
1065+ m_breakpoints->EnableOffset (address);
1066+ }
1067+
1068+
1069+ void DebuggerState::DisableBreakpoint (uint64_t address)
1070+ {
1071+ m_breakpoints->DisableAbsolute (address);
1072+ }
1073+
1074+
1075+ void DebuggerState::DisableBreakpoint (const ModuleNameAndOffset& address)
1076+ {
1077+ m_breakpoints->DisableOffset (address);
1078+ }
1079+
1080+
9831081uint64_t DebuggerState::IP ()
9841082{
9851083 if (!IsConnected ())
0 commit comments