@@ -542,6 +542,27 @@ bool GdbMiAdapter::Connect(const std::string& server, uint32_t port) {
542542 }
543543 }
544544
545+ // Detect reverse debugging / TTD support by probing the remote server's qSupported capabilities.
546+ // Servers like udbserver and rr advertise ReverseContinue+ and ReverseStep+ in qSupported.
547+ m_canReverseContinue = false ;
548+ m_canReverseStep = false ;
549+ {
550+ std::string qSupportedResponse = InvokeBackendCommand (
551+ " maintenance packet qSupported:ReverseContinue+;ReverseStep+" );
552+ if (!qSupportedResponse.empty ())
553+ {
554+ if (qSupportedResponse.find (" ReverseContinue+" ) != std::string::npos)
555+ m_canReverseContinue = true ;
556+ if (qSupportedResponse.find (" ReverseStep+" ) != std::string::npos)
557+ m_canReverseStep = true ;
558+ }
559+
560+ if (m_canReverseContinue && m_canReverseStep)
561+ LogInfo (" Reverse debugging support detected (TTD enabled)" );
562+ else
563+ LogInfo (" No reverse debugging support detected" );
564+ }
565+
545566 // AFTER we are connected and stopped, populate the cache for the first time.
546567 LogInfo (" Populating initial state cache..." );
547568 ScheduleStateRefresh ();
@@ -1031,6 +1052,30 @@ bool GdbMiAdapter::StepReturn() {
10311052 return (m_mi->SendCommand (" -exec-finish" ).command == " running" );
10321053}
10331054
1055+ bool GdbMiAdapter::GoReverse () {
1056+ if (!m_mi || m_targetRunningAtomic || !m_canReverseContinue) return false ;
1057+
1058+ return (m_mi->SendCommand (" -exec-continue --reverse" ).command == " running" );
1059+ }
1060+
1061+ bool GdbMiAdapter::StepIntoReverse () {
1062+ if (!m_mi || m_targetRunningAtomic || !m_canReverseStep) return false ;
1063+
1064+ return (m_mi->SendCommand (" -exec-step-instruction --reverse" ).command == " running" );
1065+ }
1066+
1067+ bool GdbMiAdapter::StepOverReverse () {
1068+ if (!m_mi || m_targetRunningAtomic || !m_canReverseStep) return false ;
1069+
1070+ return (m_mi->SendCommand (" -exec-next-instruction --reverse" ).command == " running" );
1071+ }
1072+
1073+ bool GdbMiAdapter::StepReturnReverse () {
1074+ if (!m_mi || m_targetRunningAtomic || !m_canReverseStep) return false ;
1075+
1076+ return (m_mi->SendCommand (" -exec-finish --reverse" ).command == " running" );
1077+ }
1078+
10341079uint64_t GdbMiAdapter::GetInstructionOffset () {
10351080 std::string ipRegisterName;
10361081 if ((m_remoteArch == " x86" ) || (m_remoteArch == " i386" ))
@@ -1091,9 +1136,10 @@ std::string GdbMiAdapter::GetTargetArchitecture() { return m_remoteArch; }
10911136bool GdbMiAdapter::SupportFeature (DebugAdapterCapacity feature) {
10921137 switch (feature) {
10931138 case DebugAdapterSupportStepOver: return true ;
1139+ case DebugAdapterSupportStepOverReverse: return m_canReverseContinue && m_canReverseStep;
10941140 case DebugAdapterSupportModules: return true ;
10951141 case DebugAdapterSupportThreads: return true ;
1096- case DebugAdapterSupportTTD: return false ;
1142+ case DebugAdapterSupportTTD: return m_canReverseContinue && m_canReverseStep ;
10971143 default : return false ;
10981144 }
10991145}
0 commit comments