Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177592702
D21658.1794810411.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
6 KB
Referenced Files
None
Subscribers
None
D21658.1794810411.diff
View Options
Index: lib/libpmcstat/libpmcstat.h
===================================================================
--- lib/libpmcstat/libpmcstat.h
+++ lib/libpmcstat/libpmcstat.h
@@ -107,8 +107,9 @@
#define FLAGS_HAS_CPUMASK 0x00040000 /* -c */
#define FLAG_HAS_DURATION 0x00080000 /* -l secs */
#define FLAG_DO_WIDE_GPROF_HC 0x00100000 /* -e */
-#define FLAG_SKIP_TOP_FN_RES 0x00200000 /* -I */
+#define FLAG_SKIP_TOP_FN_RES 0x00200000 /* -A */
#define FLAG_FILTER_THREAD_ID 0x00400000 /* -L */
+#define FLAG_SHOW_OFFSET 0x00800000 /* -I */
int pa_required; /* required features */
int pa_pplugin; /* pre-processing plugin */
Index: usr.sbin/pmcstat/pmcpl_callgraph.c
===================================================================
--- usr.sbin/pmcstat/pmcpl_callgraph.c
+++ usr.sbin/pmcstat/pmcpl_callgraph.c
@@ -152,10 +152,12 @@
* Try determine the function at this offset. If we can't
* find a function round leave the `pc' value alone.
*/
- if ((sym = pmcstat_symbol_search(image, pc)) != NULL)
- pc = sym->ps_start;
- else
- pmcstat_stats.ps_samples_unknown_function++;
+ if (!(args.pa_flags & (FLAG_SKIP_TOP_FN_RES | FLAG_SHOW_OFFSET))) {
+ if ((sym = pmcstat_symbol_search(image, pc)) != NULL)
+ pc = sym->ps_start;
+ else
+ pmcstat_stats.ps_samples_unknown_function++;
+ }
for (hash = i = 0; i < sizeof(uintfptr_t); i++)
hash += (pc >> i) & 0xFF;
@@ -488,19 +490,33 @@
sym = NULL;
/* Format name. */
- if (!(args.pa_flags & FLAG_SKIP_TOP_FN_RES))
- sym = pmcstat_symbol_search(cg->pcg_image, cg->pcg_func);
- if (sym != NULL) {
- snprintf(ns, sizeof(ns), "%s",
- pmcstat_string_unintern(sym->ps_name));
- } else
+ sym = pmcstat_symbol_search(cg->pcg_image, cg->pcg_func);
+ if (sym == NULL) {
snprintf(ns, sizeof(ns), "%p",
(void *)(cg->pcg_image->pi_vaddr + cg->pcg_func));
+ } else {
+ switch (args.pa_flags & (FLAG_SKIP_TOP_FN_RES | FLAG_SHOW_OFFSET)) {
+ case FLAG_SKIP_TOP_FN_RES | FLAG_SHOW_OFFSET:
+ case FLAG_SKIP_TOP_FN_RES:
+ snprintf(ns, sizeof(ns), "%p",
+ (void *)(cg->pcg_image->pi_vaddr + cg->pcg_func));
+ break;
+ case FLAG_SHOW_OFFSET:
+ snprintf(ns, sizeof(ns), "%s+%#0lx",
+ pmcstat_string_unintern(sym->ps_name),
+ cg->pcg_func - sym->ps_start);
+ break;
+ default:
+ snprintf(ns, sizeof(ns), "%s",
+ pmcstat_string_unintern(sym->ps_name));
+ break;
+ }
+ }
PMCSTAT_ATTRON(v_attrs);
PMCSTAT_PRINTW("%5.5s", vs);
PMCSTAT_ATTROFF(v_attrs);
- PMCSTAT_PRINTW(" %-10.10s %-20.20s",
+ PMCSTAT_PRINTW(" %-10.10s %-30.30s",
pmcstat_string_unintern(cg->pcg_image->pi_name),
ns);
@@ -624,7 +640,7 @@
qsort(sortbuffer, nentries, sizeof(struct pmcstat_cgnode *),
pmcstat_cgnode_compare);
- PMCSTAT_PRINTW("%5.5s %-10.10s %-20.20s %s\n",
+ PMCSTAT_PRINTW("%5.5s %-10.10s %-30.30s %s\n",
"%SAMP", "IMAGE", "FUNCTION", "CALLERS");
nentries = min(pmcstat_displayheight - 2, nentries);
Index: usr.sbin/pmcstat/pmcstat.8
===================================================================
--- usr.sbin/pmcstat/pmcstat.8
+++ usr.sbin/pmcstat/pmcstat.8
@@ -33,6 +33,7 @@
.Nd "performance measurement with performance monitoring hardware"
.Sh SYNOPSIS
.Nm
+.Op Fl A
.Op Fl C
.Op Fl D Ar pathname
.Op Fl E
@@ -123,6 +124,8 @@
.Sh OPTIONS
The following options are available:
.Bl -tag -width indent
+.It Fl A
+Skip symbol lookup and display address instead.
.It Fl C
Toggle between showing cumulative or incremental counts for
subsequent counting mode PMCs specified on the command line.
@@ -161,7 +164,7 @@
.Fl o
option.
.It Fl I
-Skip symbol lookup and display address instead.
+Show the offset of the instruction pointer into the symbol.
.It Fl L
List all event names.
.It Fl M Ar mapfilename
@@ -222,10 +225,10 @@
.Ar event-spec .
.It Fl T
Use a top like mode for sampling PMCs. The following hotkeys
-can be used: 'c+a' switch to accumulative mode, 'c+d' switch
-to delta mode, 'm' merge PMCs, 'n' change view, 'p' show next
-PMC, ' ' pause, 'q' quit. calltree only: 'f' cost under threshold
-is seen as a dot.
+can be used: 'A' toggle symbol resolving, 'c+a' switch to accumulative mode, 'c+d'
+switch to delta mode, 'I' toggle showing offsets into symbols, 'm' merge PMCs, 'n'
+change view, 'p' show next PMC, ' ' pause, 'q' quit. calltree only: 'f' cost under
+threshold is seen as a dot.
.It Fl U
Toggle capturing user-space call traces while in kernel mode.
The default is for sampling PMCs to capture user-space callchain information
Index: usr.sbin/pmcstat/pmcstat.c
===================================================================
--- usr.sbin/pmcstat/pmcstat.c
+++ usr.sbin/pmcstat/pmcstat.c
@@ -511,8 +511,12 @@
CPU_COPY(&rootmask, &cpumask);
while ((option = getopt(argc, argv,
- "CD:EF:G:ILM:NO:P:R:S:TUWZa:c:def:gi:k:l:m:n:o:p:qr:s:t:u:vw:z:")) != -1)
+ "ACD:EF:G:ILM:NO:P:R:S:TUWZa:c:def:gi:k:l:m:n:o:p:qr:s:t:u:vw:z:")) != -1)
switch (option) {
+ case 'A':
+ args.pa_flags |= FLAG_SKIP_TOP_FN_RES;
+ break;
+
case 'a': /* Annotate + callgraph */
args.pa_flags |= FLAG_DO_ANNOTATE;
args.pa_plugin = PMCSTAT_PL_ANNOTATE_CG;
@@ -586,14 +590,15 @@
args.pa_plugin = PMCSTAT_PL_GPROF;
break;
- case 'I':
- args.pa_flags |= FLAG_SKIP_TOP_FN_RES;
- break;
case 'i':
args.pa_flags |= FLAG_FILTER_THREAD_ID;
args.pa_tid = strtol(optarg, &end, 0);
break;
+ case 'I':
+ args.pa_flags |= FLAG_SHOW_OFFSET;
+ break;
+
case 'k': /* pathname to the kernel */
free(args.pa_kernel);
args.pa_kernel = strdup(optarg);
Index: usr.sbin/pmcstat/pmcstat_log.c
===================================================================
--- usr.sbin/pmcstat/pmcstat_log.c
+++ usr.sbin/pmcstat/pmcstat_log.c
@@ -612,6 +612,12 @@
c = wgetch(w);
wprintw(w, "Key: %c => ", c);
switch (c) {
+ case 'A':
+ if (args.pa_flags & FLAG_SKIP_TOP_FN_RES)
+ args.pa_flags &= ~FLAG_SKIP_TOP_FN_RES;
+ else
+ args.pa_flags |= FLAG_SKIP_TOP_FN_RES;
+ break;
case 'c':
wprintw(w, "enter mode 'd' or 'a' => ");
c = wgetch(w);
@@ -623,6 +629,12 @@
wprintw(w, "switching to accumulation mode");
}
break;
+ case 'I':
+ if (args.pa_flags & FLAG_SHOW_OFFSET)
+ args.pa_flags &= ~FLAG_SHOW_OFFSET;
+ else
+ args.pa_flags |= FLAG_SHOW_OFFSET;
+ break;
case 'm':
pmcstat_mergepmc = !pmcstat_mergepmc;
/*
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Nov 16, 6:26 AM (12 h, 8 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41764524
Default Alt Text
D21658.1794810411.diff (6 KB)
Attached To
Mode
D21658: pmcstat: implement showing offsets into symbols in top mode
Attached
Detach File
Event Timeline