Merge pull request #59 from HarryWeppner/dev
FreeBSD memory (leak) profiling support
This commit is contained in:
commit
9480a23005
30
bin/pprof
30
bin/pprof
@ -4197,8 +4197,12 @@ sub FindLibrary {
|
|||||||
# For libc libraries, the copy in /usr/lib/debug contains debugging symbols
|
# For libc libraries, the copy in /usr/lib/debug contains debugging symbols
|
||||||
sub DebuggingLibrary {
|
sub DebuggingLibrary {
|
||||||
my $file = shift;
|
my $file = shift;
|
||||||
if ($file =~ m|^/| && -f "/usr/lib/debug$file") {
|
if ($file =~ m|^/|) {
|
||||||
return "/usr/lib/debug$file";
|
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;
|
return undef;
|
||||||
}
|
}
|
||||||
@ -4360,6 +4364,19 @@ sub ParseLibraries {
|
|||||||
$finish = HexExtend($2);
|
$finish = HexExtend($2);
|
||||||
$offset = $zero_offset;
|
$offset = $zero_offset;
|
||||||
$lib = $3;
|
$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 {
|
} else {
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
@ -4382,6 +4399,7 @@ sub ParseLibraries {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($main::opt_debug) { printf STDERR "$start:$finish ($offset) $lib\n"; }
|
||||||
push(@{$result}, [$lib, $start, $finish, $offset]);
|
push(@{$result}, [$lib, $start, $finish, $offset]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4589,6 +4607,12 @@ sub ExtractSymbols {
|
|||||||
my $finish = $lib->[2];
|
my $finish = $lib->[2];
|
||||||
my $offset = $lib->[3];
|
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.
|
# Get list of pcs that belong in this library.
|
||||||
my $contained = [];
|
my $contained = [];
|
||||||
my ($start_pc_index, $finish_pc_index);
|
my ($start_pc_index, $finish_pc_index);
|
||||||
@ -5019,7 +5043,7 @@ sub GetProcedureBoundariesViaNm {
|
|||||||
|
|
||||||
# Tag this routine with the starting address in case the image
|
# Tag this routine with the starting address in case the image
|
||||||
# has multiple occurrences of this routine. We use a syntax
|
# 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()
|
# stripped out by ShortFunctionName()
|
||||||
$this_routine .= "<$start_val>";
|
$this_routine .= "<$start_val>";
|
||||||
|
|
||||||
|
@ -935,9 +935,12 @@ prof_dump_maps(bool propagate_err)
|
|||||||
char filename[PATH_MAX + 1];
|
char filename[PATH_MAX + 1];
|
||||||
|
|
||||||
cassert(config_prof);
|
cassert(config_prof);
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
malloc_snprintf(filename, sizeof(filename), "/proc/curproc/map");
|
||||||
|
#else
|
||||||
malloc_snprintf(filename, sizeof(filename), "/proc/%d/maps",
|
malloc_snprintf(filename, sizeof(filename), "/proc/%d/maps",
|
||||||
(int)getpid());
|
(int)getpid());
|
||||||
|
#endif
|
||||||
mfd = open(filename, O_RDONLY);
|
mfd = open(filename, O_RDONLY);
|
||||||
if (mfd != -1) {
|
if (mfd != -1) {
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
|
Loading…
Reference in New Issue
Block a user