diff options
author | Russ Cox <rsc@golang.org> | 2012-02-28 16:18:24 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2012-02-28 16:18:24 -0500 |
commit | 6e2ae0a12c0f73da56d4f465e68208731b4b16be (patch) | |
tree | 97b35b94a6880d7eb9a458663e1bfe432e4731e9 /src/cmd/addr2line | |
parent | c10f50859ead8f1578e86e65d5f376ae6a3a32df (diff) | |
download | go-6e2ae0a12c0f73da56d4f465e68208731b4b16be.tar.gz go-6e2ae0a12c0f73da56d4f465e68208731b4b16be.zip |
runtime/pprof: support OS X CPU profiling
Work around profiling kernel bug with signal masks.
Still broken on 64-bit Snow Leopard kernel,
but I think we can ignore that one and let people
upgrade to Lion.
Add new trivial tools addr2line and objdump to take
the place of the GNU tools of the same name, since
those are not installed on OS X.
Adapt pprof to invoke 'go tool addr2line' and
'go tool objdump' if the system tools do not exist.
Clean up disassembly of base register on amd64.
Fixes #2008.
R=golang-dev, bradfitz, mikioh.mikioh, r, iant
CC=golang-dev
https://golang.org/cl/5697066
Diffstat (limited to 'src/cmd/addr2line')
-rw-r--r-- | src/cmd/addr2line/main.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/cmd/addr2line/main.c b/src/cmd/addr2line/main.c new file mode 100644 index 0000000000..6b2fe5dfe1 --- /dev/null +++ b/src/cmd/addr2line/main.c @@ -0,0 +1,68 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* + * addr2line simulation - only enough to make pprof work on Macs + */ + +#include <u.h> +#include <libc.h> +#include <bio.h> +#include <mach.h> + +void +usage(void) +{ + fprint(2, "usage: addr2line binary\n"); + fprint(2, "reads addresses from standard input and writes two lines for each:\n"); + fprint(2, "\tfunction name\n"); + fprint(2, "\tfile:line\n"); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + int fd; + char *p; + uvlong pc; + Symbol s; + Fhdr fhdr; + Biobuf bin, bout; + char file[1024]; + + ARGBEGIN{ + default: + usage(); + }ARGEND + + if(argc != 1) + usage(); + + fd = open(argv[0], OREAD); + if(fd < 0) + sysfatal("open %s: %r", argv[0]); + if(crackhdr(fd, &fhdr) <= 0) + sysfatal("crackhdr: %r"); + machbytype(fhdr.type); + if(syminit(fd, &fhdr) <= 0) + sysfatal("syminit: %r"); + + Binit(&bin, 0, OREAD); + Binit(&bout, 1, OWRITE); + for(;;) { + p = Brdline(&bin, '\n'); + if(p == nil) + break; + p[Blinelen(&bin)-1] = '\0'; + pc = strtoull(p, 0, 16); + if(!findsym(pc, CTEXT, &s)) + s.name = "??"; + if(!fileline(file, sizeof file, pc)) + strcpy(file, "??:0"); + Bprint(&bout, "%s\n%s\n", s.name, file); + } + Bflush(&bout); + exits(0); +} |