]> Cypherpunks repositories - gostls13.git/commitdiff
misc/ios: run lldb commands much more carefully
authorDavid Crawshaw <crawshaw@golang.org>
Tue, 3 Mar 2015 22:54:42 +0000 (17:54 -0500)
committerDavid Crawshaw <crawshaw@golang.org>
Tue, 3 Mar 2015 23:06:45 +0000 (23:06 +0000)
We now wait until we see the completed prompt from a command before
proceeding. This seems to cut down on a spurious error I have seen
this afternoon.

Change-Id: Ic0a3481d8c265c3c3b4449ec7ac1c2752b85b0b6
Reviewed-on: https://go-review.googlesource.com/6691
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
misc/ios/go_darwin_arm_exec.go

index b7aaf5580941022744e13b9bf3335e4452016b86..eb930054da27b2f2941b07cd68a57d2608533579 100644 (file)
@@ -42,7 +42,20 @@ func main() {
        }
 }
 
-func run(bin string, args []string) error {
+func run(bin string, args []string) (err error) {
+       type waitPanic struct {
+               err error
+       }
+       defer func() {
+               if r := recover(); r != nil {
+                       if w, ok := r.(waitPanic); ok {
+                               err = w.err
+                               return
+                       }
+                       panic(r)
+               }
+       }()
+
        defer exec.Command("killall", "ios-deploy").Run() // cleanup
 
        exec.Command("killall", "ios-deploy").Run()
@@ -51,7 +64,9 @@ func run(bin string, args []string) error {
        if err != nil {
                log.Fatal(err)
        }
-       defer os.RemoveAll(tmpdir)
+       if !debug {
+               defer os.RemoveAll(tmpdir)
+       }
 
        appdir := filepath.Join(tmpdir, "gotest.app")
        if err := os.MkdirAll(appdir, 0755); err != nil {
@@ -166,6 +181,9 @@ func run(bin string, args []string) error {
        }
        do := func(cmd string) {
                fmt.Fprintln(lldb, cmd)
+               if err := waitFor(fmt.Sprintf("prompt after %q", cmd), "(lldb)"); err != nil {
+                       panic(waitPanic{err})
+               }
        }
 
        // Wait for installation and connection.
@@ -179,16 +197,10 @@ func run(bin string, args []string) error {
        do(`process handle SIGUSR1 --stop false --pass true --notify false`)
        do(`process handle SIGSEGV --stop false --pass true --notify false`) // does not work
        do(`process handle SIGBUS  --stop false --pass true --notify false`) // does not work
-       if err := waitFor("handlers set", "(lldb)"); err != nil {
-               return err
-       }
 
        do(`breakpoint set -n getwd`) // in runtime/cgo/gcc_darwin_arm.go
-       if err := waitFor("breakpoint set", "(lldb)"); err != nil {
-               return err
-       }
 
-       do(`run`)
+       fmt.Fprintln(lldb, `run`)
        if err := waitFor("br getwd", "stop reason = breakpoint"); err != nil {
                return err
        }
@@ -201,21 +213,16 @@ func run(bin string, args []string) error {
        do(`expr char* $mem = (char*)malloc(512)`)
        do(`expr $mem = (char*)getwd($mem, 512)`)
        do(`expr $mem = (char*)strcat($mem, "/` + pkgpath + `")`)
-       do(`expr int $res = (int)chdir($mem)`)
-       do(`print $res`)
-       if err := waitFor("move working dir", "(int) $res = 0"); err != nil {
-               return err
-       }
+       do(`call (void)chdir($mem)`)
 
        // Watch for SIGSEGV. Ideally lldb would never break on SIGSEGV.
        // http://golang.org/issue/10043
        go func() {
                <-w.find("stop reason = EXC_BAD_ACCESS")
-               do(`bt`)
-               // The backtrace has no obvious end, so we invent one.
-               do(`expr int $dummy = 1`)
-               do(`print $dummy`)
-               <-w.find(`(int) $dummy = 1`)
+               // cannot use do here, as the defer/recover is not available
+               // on this goroutine.
+               fmt.Fprintln(lldb, `bt`)
+               waitFor("finish backtrace", "(lldb)")
                w.printBuf()
                if p := cmd.Process; p != nil {
                        p.Kill()
@@ -224,7 +231,7 @@ func run(bin string, args []string) error {
 
        // Run the tests.
        w.trimSuffix("(lldb) ")
-       do(`process continue`)
+       fmt.Fprintln(lldb, `process continue`)
 
        // Wait for the test to complete.
        select {