[CFT] Callchain capture in PmcTools

Joseph Koshy joseph.koshy at gmail.com
Fri Aug 3 12:57:53 PDT 2007

I'm pleased to offer a patch implementing callchain capture for
hwpmc(4) for review.

Test reports, comments etc. are welcome.


>>>> Summary  <<<<


* hwpmc(4) can now walk kernel and user stacks and capture caller
  information for subsequent analysis by pmcstat(8).
* An additional flag in the API `PMC_F_CALLCHAIN' controls whether
  a PMC will capture a callchain.
* Tunable kern.hwpmc.callchaindepth controls the maximum depth to
  which stacks are walked.  The default is `8'.


* pmcstat(8) now defaults to allocating PMCs that capture callchains.
  Use the new `-N' option (a toggle) to turn this off.
* The '-g' option (gmon.out generation) now writes call arc data for
  subsequent analysis by gprof(1).
* The new '-G' option generates system-wide callchain summaries.
  The new '-z maxprintdepth' option restricts the depth of the
  the callchain summary.

>>>> Patch Information <<<<

1) Download the patch

   % fetch \

   MD5 (pmctools-callgraph-patch.gz) = 632185755d1004e82c3d2bbc69827307

2) Apply using patch -p1 against a recent (Aug 3rd) -current:

   % cvs checkout -P src
   % cd src; gzip -dc pmctools-callgraph-patch.gz | patch -p1

3) Build and update the kernel+world.

   You will need to add 'options HWPMC_HOOKS' to your kernel config
   before you can use hwpmc(4).

   % (follow the usual procedure, see src/UPDATING)

>>>> Using the patch <<<<

1) Load hwpmc into the kernel

   % kldload hwpmc

2) Collect measurements

   % pmcstat -S instructions -O logfile etc.

3) Use option -g to generate gprof(1) style 'gmon.out' files.

   % pmcstat -R logfile -g
   % gprof /boot/kernel/kernel <canonical-pmc-name>/kernel.gmon

4) Use option -G to generate a callchain summary:

   % pmcstat -R logfile -G summaryfile
   % vi summaryfile

>>>> Known Bugs with this patch <<<<

1) P4 HTT lockup

Symptom:    Lockup under load of Pentium 4 machines with HTT enabled.

Workaround: Restrict sampling to one CPU using the '-c' option:

	    # pmcstat -c 0 -S instructions -O logfile

2) pmcstat(8) stuck in an unkillable state.

Symptom:    When interrupted, pmcstat(8) gets stuck sleeping on
	    wait channel "pmcctx".
Workaround: Use the '-n' option to reduce sampling frequency:

	    # pmcstat -n 1048576 -S instructions ...other options...	

Other (older) known bugs are listed at http://wiki.freebsd.org/PmcTools.

>>>> Other Notes <<<<

pmcstat(8) works best with unstripped executables (e.g. set "STRIP="
in /etc/make.conf).

On the amd64 the heuristic used to determine the frame pointer given a
sampled PC address is not very good and can at times result in the
next to topmost frame being missed in the sampled callchain.

>>>> Thanks <<<<

 - To the users of PmcTools in the FreeBSD community for their
   feedback, encouragement and support.

 - To the FreeBSD Foundation and Google Inc., for supporting this work.


More information about the freebsd-hackers mailing list