Hi All,
I've spent the last couple of weeks trying to use perf to profile an
application. I've not had a huge amount of success. I apologise for the
long post, I'm hoping to include all the relevant details.
Kernel version 3.10.17 based off Freescale's GIT.
Processor: IMX6Solo
Build system: Buildroot 2014.08
libelf v0.8.12
For now I'm trying to profile a Qt5 example application:
/usr/lib/qt/examples/widgets/widgets/analogueclock/analogueclock.
I patched QT to build with -g -O2 -fno-omit-frame-pointer. This is for
the libraries and the application. The CXX_FLAGS in the makefile is set
to: CXXFLAGS = -pipe -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
-D_FILE_OFFSET_BITS=64 -pipe -Os -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -pipe -Os
-fno-omit-frame-pointer
--sysroot=~/buildroot-output/host/usr/arm-buildroot-linux-gnueabi/sysroot -O2
-g -fno-exceptions -Wall -W -D_REENTRANT -fPIE $(DEFINES)
For simplicities sake I copy all the Qt .so files and the application
from the staging directory onto the target. This way they avoid getting
stripped of symbols.
Running:
# perf record -o /rw/record.txt -v -g fp -p 250
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.028 MB /rw/record.txt (~1227 samples) ]
failed to write feature 9
failed to write feature 14
Note: I'm using -g fp and not DWARF because of this in tools\perf\Makefile:
# There's only x86 (both 32 and 64) support for CFI unwind so far
ifneq ($(ARCH),x86)
NO_LIBUNWIND := 1
endif
Then I try and generate a report on the target:
# perf report -v -i /rw/record.txt > /rw/report.txt
build id event received for [kernel.kallsyms]:
c8961634ed01e5bb5a79e296ba2409017a0f170a
Looking at the vmlinux_path (6 entries long)
symsrc__init: cannot get elf header.
Using /proc/kallsyms for symbols
dso__synthesize_plt_symbols: problems reading /lib/libc-2.18.so PLT info.
dso__synthesize_plt_symbols: problems reading
/usr/lib/libQt5Core.so.5.3.1 PLT info.
dso__synthesize_plt_symbols: problems reading
/usr/lib/libQt5Widgets.so.5.3.1 PLT info.
dso__synthesize_plt_symbols: problems reading
/usr/lib/libQt5Gui.so.5.3.1 PLT info.
dso__synthesize_plt_symbols: problems reading /lib/libgcc_s.so.1 PLT info.
dso__synthesize_plt_symbols: problems reading /lib/libm-2.18.so PLT info.
dso__synthesize_plt_symbols: problems reading /usr/lib/libGAL-fb.so PLT
info.
dso__synthesize_plt_symbols: problems reading /usr/lib/libGLESv2-fb.so
PLT info.
Failed to open [vectors], continuing without symbols
dso__synthesize_plt_symbols: problems reading
/usr/lib/qt/plugins/platforms/libqeglfs.so PLT info.
dso__synthesize_plt_symbols: problems reading
/usr/lib/libstdc++.so.6.0.18 PLT info.
dso__synthesize_plt_symbols: problems reading /usr/lib/libEGL-fb.so PLT
info.
There were more errors until I removed the following from
tools\perf\Makefile
ifeq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_LIBELF),-DLIBELF_MMAP),y)
BASIC_CFLAGS += -DLIBELF_MMAP
endif
I'm using a recent version of libelf (see above).
Without removing the LIBELF_MMAP define, I got an extra 4 or 5 errors
per line above. With something along the lines of "symsrc__init: cannot
read /path/here ELF file.".
Now when I look at the output of the report command I see:
http://slexy.org/view/s20E0vB0nN
So I do have some symbols being read in, but not all. For some like
/lib/libm-2.18.so this isn't surprising since I haven't copied over a
non stripped version of the library, nor have I built it with
-fno-omit-frame-pointer -g. However for others such as
/usr/lib/libQt5Gui.so.5.3.1 I do have symbols and it was built with with
the relevant flags.
Next I tried doing the report on the build machine which has all the
symbols. So I built a copy of perf for the host machine from the same
linux version. and run:
# ~/buildroot-output/host/bin/perf report -v -k
~/buildroot-output/build/linux-custom/vmlinux --symfs
~/buildroot-output/staging -i record.txt > report.txt
build id event received for [kernel.kallsyms]:
c8961634ed01e5bb5a79e296ba2409017a0f170a
[kernel.kallsyms] with build id c8961634ed01e5bb5a79e296ba2409017a0f170a
not found, continuing without symbols
Failed to open [vectors], continuing without symbols
Without the -k and the --symfs I get a bunch more errors about missing
symbols. ~/buildroot-output/staging is a copy of my rootfs that hasn't
been stripped.
Now my report.txt is: http://slexy.org/view/s21SWFq0MQ
Which as you can see is significantly worse.
So my questions are as follows:
1) Why am I missing everything other than the first entry on the call
stack when generating the report on the device?
2) Why do I get no symbols at all when generating the report on the
build machine?
3) Would you expect perf to work with LIBELF_MMAP defined?
4) Not on this application, but on the actual one I want to profile I
spend a lot of time in [vectors]. Can you clarify what this entry is?
I've read it's the exception vectors table. Is it limited to exceptions
from this application? Is there anyway to get symbols out of it.
Thanks for any help.
Andrew Parlane
Carallon LTD.
--
To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html