bin/163602: pmcstat(8) doesn' t search symbols under /boot/modules
Ulf Lilleengen
lulf at FreeBSD.org
Tue Jan 14 19:50:01 UTC 2014
The following reply was made to PR bin/163602; it has been noted by GNATS.
From: Ulf Lilleengen <lulf at FreeBSD.org>
To: bug-followup at FreeBSD.org, jbeich at tormail.net
Cc:
Subject: Re: bin/163602: pmcstat(8) doesn't search symbols under /boot/modules
Date: Tue, 14 Jan 2014 20:44:15 +0100
This is a multi-part message in MIME format.
--------------030308020102060505000202
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
I'm not able to reproduce this at the moment. Any tips on how? Or maybe
you could test out this patch:
http://people.freebsd.org/~lulf/patches/pmcstat_modules.diff
--------------030308020102060505000202
Content-Type: text/x-patch;
name="pmcstat_modules.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="pmcstat_modules.diff"
diff --git a/usr.sbin/pmcstat/pmcstat.c b/usr.sbin/pmcstat/pmcstat.c
index cc43b82..d0db9c5 100644
--- a/usr.sbin/pmcstat/pmcstat.c
+++ b/usr.sbin/pmcstat/pmcstat.c
@@ -583,7 +583,7 @@ main(int argc, char **argv)
args.pa_verbosity = 1;
args.pa_logfd = -1;
args.pa_fsroot = "";
- args.pa_kernel = strdup("/boot/kernel");
+ args.pa_kernel = strdup("/boot/kernel;/boot/modules");
args.pa_samplesdir = ".";
args.pa_printfile = stderr;
args.pa_graphdepth = DEFAULT_CALLGRAPH_DEPTH;
diff --git a/usr.sbin/pmcstat/pmcstat_log.c b/usr.sbin/pmcstat/pmcstat_log.c
index fdcf9c4..6606fa5 100644
--- a/usr.sbin/pmcstat/pmcstat_log.c
+++ b/usr.sbin/pmcstat/pmcstat_log.c
@@ -230,6 +230,8 @@ float pmcstat_threshold = 0.5; /* Cost filter for top mode. */
static struct pmcstat_image *pmcstat_image_from_path(pmcstat_interned_string
_path, int _iskernelmodule);
static void pmcstat_image_get_aout_params(struct pmcstat_image *_image);
+static void pmcstat_locate_kernelmodule(char *_buffer, size_t _buffer_length,
+ const char *_path);
static void pmcstat_image_get_elf_params(struct pmcstat_image *_image);
static void pmcstat_image_link(struct pmcstat_process *_pp,
struct pmcstat_image *_i, uintfptr_t _lpc);
@@ -602,6 +604,22 @@ pmcstat_image_add_symbols(struct pmcstat_image *image, Elf *e,
symptr->ps_end = (symptr+1)->ps_start;
}
+static void
+pmcstat_locate_kernelmodule(char *buffer, size_t buffer_length,
+ const char *path)
+{
+ char * module_paths = strdup(args.pa_kernel);
+ char * module_path = NULL;
+ while ((module_path = strsep(&module_paths, ";")) != NULL) {
+ (void) snprintf(buffer, buffer_length, "%s%s/%s", args.pa_fsroot,
+ module_path, path);
+ if (access(buffer, R_OK) == 0) {
+ break;
+ }
+ }
+ free(module_paths);
+}
+
/*
* Examine an ELF file to determine the size of its text segment.
* Sets image->pi_type if anything conclusive can be determined about
@@ -641,8 +659,7 @@ pmcstat_image_get_elf_params(struct pmcstat_image *image)
* and user mode executable objects under FSROOT/PATHNAME.
*/
if (image->pi_iskernelmodule)
- (void) snprintf(buffer, sizeof(buffer), "%s%s/%s",
- args.pa_fsroot, args.pa_kernel, path);
+ (void) pmcstat_locate_kernelmodule(buffer, sizeof(buffer), path);
else
(void) snprintf(buffer, sizeof(buffer), "%s%s",
args.pa_fsroot, path);
--------------030308020102060505000202--
More information about the freebsd-bugs
mailing list