From: Rob Pike Date: Fri, 3 Oct 2008 21:49:10 +0000 (-0700) Subject: allow prof to launch the process X-Git-Tag: weekly.2009-11-06~3051 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=bbb908fef0c46cdb76837a3c4008d08cb71cbda6;p=gostls13.git allow prof to launch the process R=rsc DELTA=32 (30 added, 0 deleted, 2 changed) OCL=16440 CL=16445 --- diff --git a/src/cmd/prof/main.c b/src/cmd/prof/main.c index c90bf85aed..6057ab501a 100644 --- a/src/cmd/prof/main.c +++ b/src/cmd/prof/main.c @@ -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);