summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2014-03-29 23:47:08 (GMT)
committerJason Evans <jasone@canonware.com>2014-03-29 23:47:08 (GMT)
commit9480a230054f6c2f2c816fe887147456bd89409b (patch)
tree76aecd50dc266c3ce620ae98b8ffea762d78396e
parent57fb8e94ae941ddffc0877714d0539f8999e5ded (diff)
parentc2da2591befa5574cf8c930a5a2cd7f56138658e (diff)
downloadjemalloc-9480a230054f6c2f2c816fe887147456bd89409b.zip
jemalloc-9480a230054f6c2f2c816fe887147456bd89409b.tar.gz
jemalloc-9480a230054f6c2f2c816fe887147456bd89409b.tar.bz2
Merge pull request #59 from HarryWeppner/dev
FreeBSD memory (leak) profiling support
-rwxr-xr-xbin/pprof30
-rw-r--r--src/prof.c5
2 files changed, 31 insertions, 4 deletions
diff --git a/bin/pprof b/bin/pprof
index 727eb43..a309943 100755
--- a/bin/pprof
+++ b/bin/pprof
@@ -4197,8 +4197,12 @@ sub FindLibrary {
# For libc libraries, the copy in /usr/lib/debug contains debugging symbols
sub DebuggingLibrary {
my $file = shift;
- if ($file =~ m|^/| && -f "/usr/lib/debug$file") {
- return "/usr/lib/debug$file";
+ if ($file =~ m|^/|) {
+ if (-f "/usr/lib/debug$file") {
+ return "/usr/lib/debug$file";
+ } elsif (-f "/usr/lib/debug$file.debug") {
+ return "/usr/lib/debug$file.debug";
+ }
}
return undef;
}
@@ -4360,6 +4364,19 @@ sub ParseLibraries {
$finish = HexExtend($2);
$offset = $zero_offset;
$lib = $3;
+ }
+ # FreeBSD 10.0 virtual memory map /proc/curproc/map as defined in
+ # function procfs_doprocmap (sys/fs/procfs/procfs_map.c)
+ #
+ # Example:
+ # 0x800600000 0x80061a000 26 0 0xfffff800035a0000 r-x 75 33 0x1004 COW NC vnode /libexec/ld-elf.s
+ # o.1 NCH -1
+ elsif ($l =~ /^(0x$h)\s(0x$h)\s\d+\s\d+\s0x$h\sr-x\s\d+\s\d+\s0x\d+\s(COW|NCO)\s(NC|NNC)\svnode\s(\S+\.so(\.\d+)*)/) {
+ $start = HexExtend($1);
+ $finish = HexExtend($2);
+ $offset = $zero_offset;
+ $lib = FindLibrary($5);
+
} else {
next;
}
@@ -4382,6 +4399,7 @@ sub ParseLibraries {
}
}
+ if($main::opt_debug) { printf STDERR "$start:$finish ($offset) $lib\n"; }
push(@{$result}, [$lib, $start, $finish, $offset]);
}
@@ -4589,6 +4607,12 @@ sub ExtractSymbols {
my $finish = $lib->[2];
my $offset = $lib->[3];
+ # Use debug library if it exists
+ my $debug_libname = DebuggingLibrary($libname);
+ if ($debug_libname) {
+ $libname = $debug_libname;
+ }
+
# Get list of pcs that belong in this library.
my $contained = [];
my ($start_pc_index, $finish_pc_index);
@@ -5019,7 +5043,7 @@ sub GetProcedureBoundariesViaNm {
# Tag this routine with the starting address in case the image
# has multiple occurrences of this routine. We use a syntax
- # that resembles template paramters that are automatically
+ # that resembles template parameters that are automatically
# stripped out by ShortFunctionName()
$this_routine .= "<$start_val>";
diff --git a/src/prof.c b/src/prof.c
index 1d8ccbd..7722b7b 100644
--- a/src/prof.c
+++ b/src/prof.c
@@ -935,9 +935,12 @@ prof_dump_maps(bool propagate_err)
char filename[PATH_MAX + 1];
cassert(config_prof);
-
+#ifdef __FreeBSD__
+ malloc_snprintf(filename, sizeof(filename), "/proc/curproc/map");
+#else
malloc_snprintf(filename, sizeof(filename), "/proc/%d/maps",
(int)getpid());
+#endif
mfd = open(filename, O_RDONLY);
if (mfd != -1) {
ssize_t nread;