
# Note that you must do all the following as root (I believe).
# Although the program to be profiled can be run by anybody.

# start the profiler
opcontrol --stop ; opcontrol --reset ; opcontrol --callgraph=5 --start

# now run the program(s) to be profiled

# stop the profiler and dump results to .. um .. some file somewhere
opcontrol --stop ; opcontrol --dump

# get total cost
opreport --merge=tgid -x \
    /home/sewardj/VgTRUNK/atomk/Inst/lib/valgrind/helgrind-amd64-linux \
    | less

# produce a flat profile
opreport --merge=tgid --symbols -x \
    /home/sewardj/VgTRUNK/atomk/Inst/lib/valgrind/helgrind-amd64-linux \
    | less

# produce a profile w/ callgraph
opreport --merge=tgid --callgraph -x \
    /home/sewardj/VgTRUNK/atomk/Inst/lib/valgrind/helgrind-amd64-linux \
    | less

# print annotated source
opannotate --merge=tgid --source --include-file=libhb_core.c | less


#### notes.

1. on amd64, need to build V with -fno-omit-frame-pointer, else the
   w/ callgraph profiles are useless.  (oprofile doesn't do CFI based
   stack unwinding, I guess).  Add -fno-omit-frame-pointer to
   AM_CFLAGS_BASE in Makefile.flags.am, and rebuild from clean.

2. even at the best of times the callgraph profiles seem pretty
   flaky to me.

3. Even oprofile 0.9.4 (the latest) on amd64-linux doesn't work
   for callgraph profiling.  There is however a patch that
   makes it work.  See 

http://sourceforge.net/tracker/index.php?func=detail&aid=1685267&group_id=16191&atid=116191

   for details.  Even then it sometimes fails at the "opcontrol
   --dump" phase, complaining that the daemon died (or something like
   that).  But apart from that, it seems usable.
