Hi Mike,
This issue has been pointed out in a pull request on the GitHub this week - though as a build issue rather than an out and out crash.
As you and the spec rightly point out - behaviour is undefined, so will vary on a per compiler / build basis - which may be why we have got away with if for so long,
I will be checking that and applying as soon as I can, then releasing a patch version of the library (though I am a conference this week so it may be a little while).
If you want to get ahead of the curve I recommend trying the patch sent with the pull request.
Regards
Mike
On 19 March 2018 at 13:02, Mike Bazov mike@perception-point.io wrote:
Hi, thank you for your answer I don't think the kernel symbols are related. I do see the segfault for the command "perf report --stdio" occurs in OpenCSD, and this is the callstack:
#0 TrcPktDecodeEtmV4I::decodePacket (this=this@entry=0x555555e9a650, Complete=@0x7fffffffbb67: true) at /home/mike/repo/OpenCSD/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp:373 #1 0x00007ffff69b812b in TrcPktDecodeEtmV4I::processPacket (this=0x555555e9a650) at /home/mike/repo/OpenCSD/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp:99 #2 0x00007ffff69b8b58 in TrcPktDecodeBase<EtmV4ITrcPacket, EtmV4Config>::PacketDataIn ( this=0x555555e9a650, op=OCSD_OP_DATA, index_sop=41, p_packet_in=0x555555e98cf8) at /home/mike/repo/OpenCSD/decoder/include/common/trc_pkt_decode_base.h:247 #3 0x00007ffff69b4000 in EtmV4IPktProcImpl::processData (this=0x555555e98c70, index=<optimized out>, dataBlockSize=15, pDataBlock=0x555555e94869 "\177\201\177\377\377", numBytesProcessed=0x7fffffffbda4) at /home/mike/repo/OpenCSD/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.cpp:115 #4 0x00007ffff69b036a in TrcPktProcBase<EtmV4ITrcPacket, _ocsd_etmv4_i_pkt_type, EtmV4Config>::TraceDataIn (this=0x555555e98aa0, op=<optimized out>, index=32, dataBlockSize=<optimized out>, pDataBlock=<optimized out>, numBytesProcessed=<optimized out>) at /home/mike/repo/OpenCSD/decoder/include/common/trc_pkt_proc_base.h:238 #5 0x00007ffff69a18bd in TraceFmtDcdImpl::outputFrame (this=this@entry=0x555555e93780) at /home/mike/repo/OpenCSD/decoder/source/trc_frame_deformatter.cpp:700 #6 0x00007ffff69a1c24 in TraceFmtDcdImpl::processTraceData (this=0x555555e93780, index=<optimized out>, dataBlockSize=<optimized out>, pDataBlock=<optimized out>, numBytesProcessed=0x7fffffffbee4) at /home/mike/repo/OpenCSD/decoder/source/trc_frame_deformatter.cpp:272 #7 0x00005555558284b6 in cs_etm_decoder__process_data_block (decoder=0x555555e8b2d0, indx=0, buf=buf@entry=0x7ffff7ff25aa ")", len=len@entry=16640, consumed=consumed@entry=0x7fffffffbf68) at util/cs-etm-decoder/cs-etm-decoder.c:518 #8 0x0000555555826d22 in cs_etm__run_decoder (etmq=0x555555e7b150) at util/cs-etm.c:986 #9 cs_etm__process_timeless_queues (etm=0x555555e7a070, tid=2161, time_=18446744073709551615)
This is the instruction that causes the segfault as far as i saw:
Program received signal SIGSEGV, Segmentation fault. TrcPktDecodeEtmV4I::decodePacket (this=this@entry=0x555555e9a650, Complete=@0x7fffffffbb67: true) at /home/mike/repo/OpenCSD/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp:373 372 std::vector<uint32_t> params; 373 params[0] = m_curr_packet_in->getCC();
This segfaults because accessing an element in a vector that doesn't exist causes undefined behavior.. this causes segfault on my system. Any OpenCSD contributor that can help?
Thanks, Mike.
On Mon, Mar 19, 2018 at 11:40 AM, Leo Yan leo.yan@linaro.org wrote:
Hi Mike,
On Mon, Mar 19, 2018 at 11:08:17AM +0200, Mike Bazov wrote:
Greetings, i was referred to this mailing list by Mathleu Poirler.
I'm recording Coresight using my Dragonboard 410c board, after compiling the perf-opencsd-master kernel.
I am using acme branch: https://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git
Recording seems to work on a simple program i did which does nothing but print a string to the screen.
Now, i use perf to hopefully decode the trace, but perf segfaults. I'll let you know that decoding using the sample trace given here: https://github.com/Linaro/OpenCSD/blob/master/HOWTO.md
Does work.
I dived into the cs-trace-disasm.py script to see why exactly it doesn't work and i noticed this command causes the segfault: $ ~/linux/tools/perf/perf script --show-mmap-events
/lib/aarch64-linux-gnu/ld-2.26.so with build id 6516ef8fa13fcb739834af9e87fb5fe9df612096 not found, con> Segmentation fault (core dumped)
This command also segfaults:
$ ~/linux/tools/perf/perf report --stdio
/lib/aarch64-linux-gnu/ld-2.26.so with build id 6516ef8fa13fcb739834af9e87fb5fe9df612096 not found, con> (END)Segmentation fault (core dumped)
I have not seen segmentation fault issue, but it's good to share some my finding:
I remembered if use kallsyms for kernel symbols, you need enable kernel configs:
CONFIG_PROC_KCORE=y CONFIG_PROC_VMCORE=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y
Also please note that the userspace has permission to export the complete kernel address info; IIRC, you need set '0' or '1' to below entry: echo 0 > /proc/sys/kernel/kptr_restrict
If you want to specify kernel for importing kernel symbol table, like this command './perf report -k ./vmlinux --stdio', you might need notice this patch: https://www.spinics.net/lists/linux-perf-users/msg05576.html
If upper two methods work, I still think it might need root cause the segmentation fault issue and fix with extra patches.
Thanks, Leo Yan
But this command works:
$ ~/linux/tools/perf/perf report --stdio --dump
And i can see Coresight packets information when browsing the output.
My .debug directory looks like this:
~/.debug/ |-- [kernel.kallsyms] | `-- 1dc43d23817467d7717b19af07463af0d9a9bd83 | `-- kallsyms |-- [vdso] | `-- 18863444e4f3e2600f53e406421b2a0edd940888 | `-- vdso |-- bin | `-- check | `-- 31694f29996e06da12f63d6088ec6eb23b3079c4 | `-- elf `-- lib `-- aarch64-linux-gnu |-- ld-2.26.so | `-- 6516ef8fa13fcb739834af9e87fb5fe9df612096 | `-- elf `-- libc.so.6 `-- 06e99d8d6acabab0643e0f525ac561cf73db6498 `-- elf
Now, another need i wanted to ask is where can i find the code that uses OpenCSD to decode the trace and output instructions? eventually, i don't want to use perf, but rather use OpenCSD directly in my code to decode traces.
Not sure what to do here and how to proceed, i'll appreciate some help. Thank you all!
CoreSight mailing list CoreSight@lists.linaro.org https://lists.linaro.org/mailman/listinfo/coresight
CoreSight mailing list CoreSight@lists.linaro.org https://lists.linaro.org/mailman/listinfo/coresight