gdbserial/gdbserver: Dynamically resolve debugserver binary (#1994)
* gdbserial/gdbserver: Dynamically resolve debugserver binary Instead of hardcoding the absolute path to the Command Line Tools (CLT) binary, will attempt to resolve the path at the $PATH, or at the Xcode bundle. If none are available, will fallback to the default CLT location. Fixes #986 * gdbserial/gdbserver: Log outgoing executed commands Add logging to capture the executable and associated arguments used in LLDBLaunch and LLDBAttach Related to #986 * gdbserial/gdbserver: Add unit tests for helper function Define unit tests for helper function. Setup each test to temporarily make PATH variable, and file system changes, and subsequently revert them. Related to #986 * gdbserial/gdbserver: Lazily load function Lazily obtain absolute path to avoid increasing load times. Remove flaky tests. Related to #986
This commit is contained in:
parent
0c9846c0a4
commit
bc30b53926
@ -299,7 +299,31 @@ func unusedPort() string {
|
|||||||
return fmt.Sprintf(":%d", port)
|
return fmt.Sprintf(":%d", port)
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugserverExecutable = "/Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver"
|
// Helper function to resolve path of "debugserver"
|
||||||
|
//
|
||||||
|
// Returns a string of the absolute path to the debugserver binary IFF it is
|
||||||
|
// found in the system path ($PATH) or in the Xcode bundle. Otherwise will
|
||||||
|
// return the path to the standalone CLT location
|
||||||
|
func GetDebugServerAbsolutePath() string {
|
||||||
|
if path, err := exec.LookPath("debugserver"); err == nil {
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
if xcodePath, e := exec.LookPath("/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Versions/A/Resources/debugserver"); e == nil {
|
||||||
|
return xcodePath
|
||||||
|
}
|
||||||
|
|
||||||
|
return "/Library/Developer/CommandLineTools/Library/PrivateFrameworks/LLDB.framework/Versions/A/Resources/debugserver"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process logger function
|
||||||
|
//
|
||||||
|
// A wrapper around the exec.Command() function to log the arguments prior to
|
||||||
|
// starting the process
|
||||||
|
func commandLogger(binary string, arguments ...string) *exec.Cmd {
|
||||||
|
logflags.GdbWireLogger().Debugf("executing %s %v", binary, arguments)
|
||||||
|
return exec.Command(binary, arguments...)
|
||||||
|
}
|
||||||
|
|
||||||
// ErrUnsupportedOS is returned when trying to use the lldb backend on Windows.
|
// ErrUnsupportedOS is returned when trying to use the lldb backend on Windows.
|
||||||
var ErrUnsupportedOS = errors.New("lldb backend not supported on Windows")
|
var ErrUnsupportedOS = errors.New("lldb backend not supported on Windows")
|
||||||
@ -339,7 +363,7 @@ func LLDBLaunch(cmd []string, wd string, foreground bool, debugInfoDirs []string
|
|||||||
var listener net.Listener
|
var listener net.Listener
|
||||||
var port string
|
var port string
|
||||||
var process *exec.Cmd
|
var process *exec.Cmd
|
||||||
if _, err := os.Stat(debugserverExecutable); err == nil {
|
if _, err := os.Stat(GetDebugServerAbsolutePath()); err == nil {
|
||||||
listener, err = net.Listen("tcp", "127.0.0.1:0")
|
listener, err = net.Listen("tcp", "127.0.0.1:0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -358,7 +382,7 @@ func LLDBLaunch(cmd []string, wd string, foreground bool, debugInfoDirs []string
|
|||||||
|
|
||||||
isDebugserver = true
|
isDebugserver = true
|
||||||
|
|
||||||
process = exec.Command(debugserverExecutable, args...)
|
process = commandLogger(GetDebugServerAbsolutePath(), args...)
|
||||||
} else {
|
} else {
|
||||||
if _, err := exec.LookPath("lldb-server"); err != nil {
|
if _, err := exec.LookPath("lldb-server"); err != nil {
|
||||||
return nil, &ErrBackendUnavailable{}
|
return nil, &ErrBackendUnavailable{}
|
||||||
@ -368,7 +392,7 @@ func LLDBLaunch(cmd []string, wd string, foreground bool, debugInfoDirs []string
|
|||||||
args = append(args, "gdbserver", port, "--")
|
args = append(args, "gdbserver", port, "--")
|
||||||
args = append(args, cmd...)
|
args = append(args, cmd...)
|
||||||
|
|
||||||
process = exec.Command("lldb-server", args...)
|
process = commandLogger("lldb-server", args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
if logflags.LLDBServerOutput() || logflags.GdbWire() || foreground {
|
if logflags.LLDBServerOutput() || logflags.GdbWire() || foreground {
|
||||||
@ -420,19 +444,19 @@ func LLDBAttach(pid int, path string, debugInfoDirs []string) (*proc.Target, err
|
|||||||
var process *exec.Cmd
|
var process *exec.Cmd
|
||||||
var listener net.Listener
|
var listener net.Listener
|
||||||
var port string
|
var port string
|
||||||
if _, err := os.Stat(debugserverExecutable); err == nil {
|
if _, err := os.Stat(GetDebugServerAbsolutePath()); err == nil {
|
||||||
isDebugserver = true
|
isDebugserver = true
|
||||||
listener, err = net.Listen("tcp", "127.0.0.1:0")
|
listener, err = net.Listen("tcp", "127.0.0.1:0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
process = exec.Command(debugserverExecutable, "-R", fmt.Sprintf("127.0.0.1:%d", listener.Addr().(*net.TCPAddr).Port), "--attach="+strconv.Itoa(pid))
|
process = commandLogger(GetDebugServerAbsolutePath(), "-R", fmt.Sprintf("127.0.0.1:%d", listener.Addr().(*net.TCPAddr).Port), "--attach="+strconv.Itoa(pid))
|
||||||
} else {
|
} else {
|
||||||
if _, err := exec.LookPath("lldb-server"); err != nil {
|
if _, err := exec.LookPath("lldb-server"); err != nil {
|
||||||
return nil, &ErrBackendUnavailable{}
|
return nil, &ErrBackendUnavailable{}
|
||||||
}
|
}
|
||||||
port = unusedPort()
|
port = unusedPort()
|
||||||
process = exec.Command("lldb-server", "gdbserver", "--attach", strconv.Itoa(pid), port)
|
process = commandLogger("lldb-server", "gdbserver", "--attach", strconv.Itoa(pid), port)
|
||||||
}
|
}
|
||||||
|
|
||||||
process.Stdout = os.Stdout
|
process.Stdout = os.Stdout
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user