Commit bbb908fe authored by Rob Pike's avatar Rob Pike

allow prof to launch the process

R=rsc
DELTA=32  (30 added, 0 deleted, 2 changed)
OCL=16440
CL=16445
parent 347cf67a
...@@ -33,7 +33,7 @@ int stacks; // print stack traces ...@@ -33,7 +33,7 @@ int stacks; // print stack traces
void void
Usage(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, "\tformats (default -h):\n");
fprint(2, "\t\t-h: histograms\n"); fprint(2, "\t\t-h: histograms\n");
fprint(2, "\t\t-f: dynamic functions\n"); fprint(2, "\t\t-f: dynamic functions\n");
...@@ -283,6 +283,33 @@ dumphistogram() ...@@ -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 int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
...@@ -304,6 +331,7 @@ main(int argc, char *argv[]) ...@@ -304,6 +331,7 @@ main(int argc, char *argv[])
break; break;
case 'h': case 'h':
histograms = 1; histograms = 1;
break;
case 'l': case 'l':
linenums = 1; linenums = 1;
break; break;
...@@ -314,7 +342,7 @@ main(int argc, char *argv[]) ...@@ -314,7 +342,7 @@ main(int argc, char *argv[])
stacks = 1; stacks = 1;
break; break;
}ARGEND }ARGEND
if(pid <= 0) if(pid <= 0 && argc == 0)
Usage(); Usage();
if(functions+linenums+registers+stacks == 0) if(functions+linenums+registers+stacks == 0)
histograms = 1; histograms = 1;
...@@ -329,6 +357,8 @@ main(int argc, char *argv[]) ...@@ -329,6 +357,8 @@ main(int argc, char *argv[])
fprint(2, "prof: can't open %s: %r\n", file); fprint(2, "prof: can't open %s: %r\n", file);
exit(1); exit(1);
} }
if(pid <= 0)
pid = startprocess(argv);
map = attachproc(pid, &fhdr); map = attachproc(pid, &fhdr);
if(map == nil) { if(map == nil) {
fprint(2, "prof: can't attach to %d: %r\n", pid); fprint(2, "prof: can't attach to %d: %r\n", pid);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment