diff --git a/pkg/proc/gdbserial/gdbserver_conn.go b/pkg/proc/gdbserial/gdbserver_conn.go index 47295d12ea..6f4c7e7896 100644 --- a/pkg/proc/gdbserial/gdbserver_conn.go +++ b/pkg/proc/gdbserial/gdbserver_conn.go @@ -940,7 +940,10 @@ func (conn *gdbConn) queryThreads(first bool) (threads []string, err error) { } func (conn *gdbConn) selectThread(kind byte, threadID string, context string) error { - if conn.threadSuffixSupported { + if conn.threadSuffixSupported && kind != 'c' { + // kind == 'c' is still allowed because 'rr' is weird about it's support + // for thread suffixes and the specification for it doesn't really say how + // it should be used with packets 'bc' and 'bs'. panic("selectThread when thread suffix is supported") } conn.outbuf.Reset() @@ -1144,9 +1147,15 @@ func (conn *gdbConn) qRRCmd(args ...string) (string, error) { } conn.outbuf.Reset() fmt.Fprint(&conn.outbuf, "$qRRCmd") - for _, arg := range args { + for i, arg := range args { fmt.Fprint(&conn.outbuf, ":") - writeAsciiBytes(&conn.outbuf, []byte(arg)) + if i == 0 && conn.threadSuffixSupported { + // newer versions of RR require the command to be followed by a thread id + // and the command name to be unescaped. + fmt.Fprintf(&conn.outbuf, "%s:-1", arg) + } else { + writeAsciiBytes(&conn.outbuf, []byte(arg)) + } } resp, err := conn.exec(conn.outbuf.Bytes(), "qRRCmd") if err != nil { diff --git a/pkg/proc/gdbserial/rr.go b/pkg/proc/gdbserial/rr.go index ecaa882021..3fdff59b93 100644 --- a/pkg/proc/gdbserial/rr.go +++ b/pkg/proc/gdbserial/rr.go @@ -217,9 +217,10 @@ type rrInit struct { const ( rrGdbCommandLegacyPrefix = " gdb " - rrGdbCommandPrefix = " 'gdb' " - rrGdbLaunchPrefix = "Launch gdb with" - targetCmd = "target extended-remote " + rrGdbCommandPrefix = " 'gdb' " + rrGdbLaunchLegacyPrefix = "Launch gdb with" + rrGdbLaunchPrefix = "Launch debugger with" + targetCmd = "target extended-remote " ) func rrStderrParser(stderr io.ReadCloser, initch chan<- rrInit, quiet bool) { @@ -245,7 +246,7 @@ func rrStderrParser(stderr io.ReadCloser, initch chan<- rrInit, quiet bool) { break } - if strings.HasPrefix(line, rrGdbLaunchPrefix) { + if strings.HasPrefix(line, rrGdbLaunchPrefix) || strings.HasPrefix(line, rrGdbLaunchLegacyPrefix) { continue }