Commit 3f106f97 authored by Russ Cox's avatar Russ Cox

make prof work on linux

R=r
DELTA=18  (11 added, 1 deleted, 6 changed)
OCL=15752
CL=15755
parent c79dffd5
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
#include <u.h> #include <u.h>
#include <time.h>
#include <libc.h> #include <libc.h>
#include <bio.h> #include <bio.h>
#include <ctype.h> #include <ctype.h>
#include <time.h>
#include <ureg_amd64.h> #include <ureg_amd64.h>
#include <mach_amd64.h> #include <mach_amd64.h>
...@@ -88,14 +88,18 @@ regprint(void) ...@@ -88,14 +88,18 @@ regprint(void)
} }
int int
sample() sample(void)
{ {
int i; int i;
static int n;
n++;
ctlproc(pid, "stop"); ctlproc(pid, "stop");
for(i = 0; i < sizeof ureg; i+=8) { for(i = 0; i < sizeof ureg; i+=8) {
if(get8(map, (uvlong)i, &((uvlong*)&ureg)[i/8]) < 0) { if(get8(map, (uvlong)i, &((uvlong*)&ureg)[i/8]) < 0) {
fprint(2, "prof: can't read registers at %d: %r\n", i); if(n == 1)
fprint(2, "prof: can't read registers at %d: %r\n", i);
ctlproc(pid, "start");
return 0; return 0;
} }
} }
...@@ -106,9 +110,13 @@ sample() ...@@ -106,9 +110,13 @@ sample()
uvlong nextpc; uvlong nextpc;
void void
ptrace(Map *map, uvlong pc, uvlong sp, Symbol *sym) xptrace(Map *map, uvlong pc, uvlong sp, Symbol *sym)
{ {
char buf[1024]; char buf[1024];
if(sym == nil){
print("syms\n");
return;
}
if(nextpc == 0) if(nextpc == 0)
nextpc = sym->value; nextpc = sym->value;
print("%s(", sym->name); print("%s(", sym->name);
...@@ -128,7 +136,7 @@ stacktracepcsp(uvlong pc, uvlong sp) ...@@ -128,7 +136,7 @@ stacktracepcsp(uvlong pc, uvlong sp)
nextpc = 0; nextpc = 0;
if(machdata->ctrace==nil) if(machdata->ctrace==nil)
fprint(2, "no machdata->ctrace\n"); fprint(2, "no machdata->ctrace\n");
else if(machdata->ctrace(map, pc, sp, 0, ptrace) <= 0) else if(machdata->ctrace(map, pc, sp, 0, xptrace) <= 0)
fprint(2, "no stack frame: pc=%#p sp=%#p\n", pc, sp); fprint(2, "no stack frame: pc=%#p sp=%#p\n", pc, sp);
} }
...@@ -172,7 +180,8 @@ printpc(uvlong pc, uvlong sp) ...@@ -172,7 +180,8 @@ printpc(uvlong pc, uvlong sp)
} }
} }
void samples() void
samples(void)
{ {
int msec; int msec;
struct timespec req; struct timespec req;
...@@ -334,6 +343,7 @@ main(int argc, char *argv[]) ...@@ -334,6 +343,7 @@ main(int argc, char *argv[])
fprint(2, "prof: crack header for %s: %r\n", file); fprint(2, "prof: crack header for %s: %r\n", file);
exit(1); exit(1);
} }
ctlproc(pid, "start");
samples(); samples();
detachproc(map); detachproc(map);
dumphistogram(); dumphistogram();
......
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