Profiling code execution on amd64?
fbsdcurrent at beasties.demon.nl
Sat Jan 15 19:51:49 UTC 2011
On 01/15/11 07:15, Garrett Cooper wrote:
> On Fri, Jan 14, 2011 at 10:10 PM, Steve Kargl
> <sgk at troutmask.apl.washington.edu> wrote:
>> On Fri, Jan 14, 2011 at 03:40:46PM -0500, George Neville-Neil wrote:
>>> On Jan 13, 2011, at 23:05 , Steve Kargl wrote:
>>>> On Thu, Jan 13, 2011 at 10:08:30PM -0500, Ryan Stone wrote:
>>>>> I would suggest using hwpmc for profiling:
>>>>> # kldload hwpmc
>>>>> # pmcstat -S unhalted-cycles -O /tmp/samples.out ../penetration
>>>>> # pmcstat -R /tmp/samples.out -G /tmp/penetration.txt
>>>>> You can also get pmcstat to generate gprof-compatible output with -g,
>>>>> but I never use the mode so I'm really not sure what it gives you. I
>>>>> think that you have to run gprof on the output or something, but don't
>>>>> hold me to that.
>>>> Thanks. I'll give it a try, but my initial attempt seems to
>>>> indicate that one needs to be root to use hwpmc.
>>>> laptop:kargl pmcstat -S unhalted-cycles -O /tmp/samples.out ../penetration
>>>> pmcstat: ERROR: Cannot allocate system-mode pmc with specification
>>>> "unhalted-cycles": Operation not permitted
>>> You only need to be root to profile the kernel or someone else's process.
>>> This tutorial might help:
>> Thanks. I'll look at the tutorial. Meanwhile, should gprof
>> be removed from the base system because it appears broken?
> Instead of just removing things, why not determine why things are
> broken and try to fix them?
gprof is not as badly broken as it seems 8-)
I have encountered the issue described by the original poster regularly
over the last few years, using different versions of FreeBSD. The total
time reported by gprof is often way shorter than the time reported by
time. I have checked that the problem goes back to at least 7.3-RELEASE,
and it occurs on both amd64 and i386.
I found that this problem is caused by neither the profile start-up code
nor gprof knowing about dynamic linking. The start-up code calls
profil() with etext as the upper limit of the address range to be
profiled. This implies that all dynamically linked code will not be
profiled, which explains the lost ticks in gprof.
A solution might be to teach both the profiling start-up code and gprof
about dynamic linking, but I guess that is not that trivial ...
A good work-around is linking statically (-static). Also be aware that
with dynamic linking and specifying -pg, a profiled (and static!)
version is used only for the C library. So if e.g. the math library is
needed -lm_p has to be specified explicitly instead of just -lm, or
ticks will be lost. So specifying standard libraries with _p appended
might already solve most of the problems.
I also remember (and just verified) that in the "good old days" (FreeBSD
2.2.8) static linking took place automatically when profiling was
requested, so the issues at hand might not even be new 8-)
PS. Thanks for the link to your tutorial, George. I am very interested
in hwpmc, and since documentation seems to be somewhat sparse, this
More information about the freebsd-current