問題如下:
# export LD_LIBRARY_PATH=lib
# ./perf record -p 1054
Segmentation fault
分析如下:
# gdb ./perf record -p 1054
(gdb) r
Starting program: /mnt/SDCARD/perf/perf record -p 1054
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
Program received signal SIGSEGV, Segmentation fault.
0x00492ff0 in snprintf (__fmt=0x5975ec "%s%s", __n=4096, __s=0x1cacec0 "")
at /opt/mmiyoo/arm-buildroot-linux-gnueabihf/sysroot/usr/include/bits/stdio2.h:67
67 /opt/mmiyoo/arm-buildroot-linux-gnueabihf/sysroot/usr/include/bits/stdio2.h: No such file or directory.
(gdb) bt
#0 0x00492ff0 in snprintf (__fmt=0x5975ec "%s%s", __n=4096, __s=0x1cacec0 "")
at /opt/mmiyoo/arm-buildroot-linux-gnueabihf/sysroot/usr/include/bits/stdio2.h:67
#1 perf_event__synthesize_kernel_mmap (tool=0x5d7918 <record>,
process=0x41d460 <process_synthesized_event>,
machine=machine@entry=0x1ca4da0) at util/event.c:714
#2 0x0041ded4 in record__synthesize (tail=tail@entry=false,
rec=0x5d7918 <record>) at builtin-record.c:792
#3 0x0041ee6c in __cmd_record (rec=0x5d7918 <record>, argv=<optimized out>,
argc=0) at builtin-record.c:916
#4 cmd_record (argc=0, argv=<optimized out>, prefix=<optimized out>)
at builtin-record.c:1700
#5 0x004859e0 in run_builtin (argv=0xbefffe08, argc=3,
p=0x5d89ec <commands+84>) at perf.c:357
#6 handle_internal_command (argc=3, argv=0xbefffe08) at perf.c:419
#7 0x0040f674 in run_argv (argv=0xbefffb68, argcp=0xbefffb6c) at perf.c:609
#8 main (argc=<optimized out>, argv=<optimized out>) at perf.c:609
Crash Point
int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
perf_event__handler_t process,
struct machine *machine)
{
...
size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
"%s%s", mmap_name, kmap->ref_reloc_sym->name) + 1;
這個Crash的點真的蠻奇特,找了一下,還是找不出問題,使用如下Workaround就可以解決
int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
perf_event__handler_t process,
struct machine *machine)
{
return 0;
}
雖然缺少一些Kernel資訊,不過,用來找出User Application的效能瓶頸,這樣的解決還是可以接受的
# export LD_LIBRARY_PATH=lib # ./perf record -p 1054 # ./perf report