From 4814636780e47bcbe20e3e1adec54da4e39b4aad Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Fri, 8 May 2015 15:14:04 -0500 Subject: [PATCH] Fix: Pass args to OSX fork_exec / trim args --- cmd/dlv/main.go | 4 ++-- proctl/proctl_darwin.go | 23 +++++++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/cmd/dlv/main.go b/cmd/dlv/main.go index f9df6626..c1713b2c 100644 --- a/cmd/dlv/main.go +++ b/cmd/dlv/main.go @@ -80,7 +80,7 @@ func main() { } defer os.Remove(debugname) - processArgs = append([]string{"./" + debugname}, flag.Args()...) + processArgs = append([]string{"./" + debugname}, flag.Args()[1:]...) case "test": wd, err := os.Getwd() if err != nil { @@ -97,7 +97,7 @@ func main() { debugname := "./" + base + ".test" defer os.Remove(debugname) - processArgs = append([]string{debugname}, flag.Args()...) + processArgs = append([]string{debugname}, flag.Args()[1:]...) case "attach": pid, err := strconv.Atoi(flag.Args()[1]) if err != nil { diff --git a/proctl/proctl_darwin.go b/proctl/proctl_darwin.go index b0270379..b304dd15 100644 --- a/proctl/proctl_darwin.go +++ b/proctl/proctl_darwin.go @@ -2,6 +2,7 @@ package proctl // #include "proctl_darwin.h" // #include "exec_darwin.h" +// #include import "C" import ( "debug/gosym" @@ -29,14 +30,20 @@ type OSProcessDetails struct { // custom fork/exec process in order to take advantage of // PT_SIGEXC on Darwin. func Launch(cmd []string) (*DebuggedProcess, error) { - argv0, err := filepath.Abs(cmd[0]) + argv0Go, err := filepath.Abs(cmd[0]) if err != nil { return nil, err } + argv0 := C.CString(argv0Go) - argv := C.CString(cmd[0]) - if len(cmd) == 1 { - argv = nil + argvSlice := make([]*C.char, 0, len(cmd)) + for _, arg := range cmd { + argvSlice = append(argvSlice, C.CString(arg)) + } + + var argv **C.char + if len(cmd) > 1 { + argv = &argvSlice[0] } dbp := &DebuggedProcess{ @@ -47,13 +54,17 @@ func Launch(cmd []string) (*DebuggedProcess, error) { ast: source.New(), } - pid := int(C.fork_exec(C.CString(argv0), &argv, &dbp.os.task, &dbp.os.portSet, &dbp.os.exceptionPort, &dbp.os.notificationPort)) + ret := C.fork_exec(argv0, argv, &dbp.os.task, &dbp.os.portSet, &dbp.os.exceptionPort, &dbp.os.notificationPort) + pid := int(ret) if pid <= 0 { return nil, fmt.Errorf("could not fork/exec") } dbp.Pid = pid + for i := range argvSlice { + C.free(unsafe.Pointer(argvSlice[i])) + } - dbp, err = initializeDebugProcess(dbp, argv0, false) + dbp, err = initializeDebugProcess(dbp, argv0Go, false) if err != nil { return nil, err }