]> Cypherpunks repositories - gostls13.git/commitdiff
allow prof to launch the process
authorRob Pike <r@golang.org>
Fri, 3 Oct 2008 21:49:10 +0000 (14:49 -0700)
committerRob Pike <r@golang.org>
Fri, 3 Oct 2008 21:49:10 +0000 (14:49 -0700)
R=rsc
DELTA=32  (30 added, 0 deleted, 2 changed)
OCL=16440
CL=16445

src/cmd/prof/main.c

index c90bf85aed85c50f89f08e0659b21798d8821b30..6057ab501a971a15d3526f6f1d35d29d63c6585d 100644 (file)
@@ -33,7 +33,7 @@ int stacks;           // print stack traces
 void
 Usage(void)
 {
-       fprint(2, "Usage: prof -p pid [-t total_secs] [-d delta_msec] [6.out]\n");
+       fprint(2, "Usage: prof -p pid [-t total_secs] [-d delta_msec] [6.out args ...]\n");
        fprint(2, "\tformats (default -h):\n");
        fprint(2, "\t\t-h: histograms\n");
        fprint(2, "\t\t-f: dynamic functions\n");
@@ -283,6 +283,33 @@ dumphistogram()
        }
 }
 
+int
+startprocess(char **argv)
+{
+       int pid;
+
+       if((pid = fork()) == 0) {
+               pid = getpid();
+               if(ctlproc(pid, "hang") < 0){
+                       fprint(2, "prof: child process could not hang\n");
+                       exits(0);
+               }
+               execv(argv[0], argv);
+               fprint(2, "prof: could not exec %s: %r\n", argv[0]);
+               exits(0);
+       }
+
+       if(pid == -1) {
+               fprint(2, "prof: could not fork\n");
+               exit(1);
+       }
+       if(ctlproc(pid, "attached") < 0 || ctlproc(pid, "waitstop") < 0) {
+               fprint(2, "prof: could not attach to child process: %r\n");
+               exit(1);
+       }
+       return pid;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -304,6 +331,7 @@ main(int argc, char *argv[])
                break;
        case 'h':
                histograms = 1;
+               break;
        case 'l':
                linenums = 1;
                break;
@@ -314,7 +342,7 @@ main(int argc, char *argv[])
                stacks = 1;
                break;
        }ARGEND
-       if(pid <= 0)
+       if(pid <= 0 && argc == 0)
                Usage();
        if(functions+linenums+registers+stacks == 0)
                histograms = 1;
@@ -329,6 +357,8 @@ main(int argc, char *argv[])
                fprint(2, "prof: can't open %s: %r\n", file);
                exit(1);
        }
+       if(pid <= 0)
+               pid = startprocess(argv);
        map = attachproc(pid, &fhdr);
        if(map == nil) {
                fprint(2, "prof: can't attach to %d: %r\n", pid);