From: Arnaldo Carvalho de Melo [mailto:a...@kernel.org] >Em Tue, Nov 03, 2015 at 12:50:46AM +0000, Alex Bagehot escreveu: >> Hello, >> >> I get this error with perf probe, : >> >> perf probe -vvv -x /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so >> '_ZN13CollectedHeap24common_mem_allocate_initE11KlassHandlemP6Thread'
Ah, I've never thought that the symbol name gets so long :( BTW, is that oracle's jdk package? I'd like to reproduce the bug. >> >> probe-definition(0): >> _ZN13CollectedHeap24common_mem_allocate_initE11KlassHandlemP6Thread >> symbol:_ZN13CollectedHeap24common_mem_allocate_initE11KlassHandlemP6Thread >> file:(null) line:0 offset:0 return:0 lazy:(null) >> 0 arguments >> Opening /sys/kernel/debug/tracing/uprobe_events write=1 >> Added new event: >> snprintf() failed: -7 >> Error: Failed to add events. Reason: Argument list too long (Code: -7) >> >> >> it looks like it's failing here: ./util/probe-event.c >> probe_trace_event__set_name >> >> /* Get an unused new event name */ >> ret = get_new_event_name(buf, 64, event, >> namelist, allow_suffix); > >Masami, do we really need to cap it at 64 bytes? And would it be >possible to improve that error reporting? I.e. this isn't an "argument >list", right? No, but it is used for event name whose maximum length is 63+\0. There is actually no reason for 64, but we need a limitation for event name. And, yeah, the error message comes from E2BIG. #define E2BIG 7 /* Argument list too long */ So, the "argument" means argument of snprintf. >> It works with a function 63 chars long not 64. >> Knowing it is the event name erroring, It also works if I give the >> event a short name eg. 'a'. I don't understand why it creates 3 probes >> though? > >Masami? You gave this explanation at some point, but I forgot, aliases? >Inlining? Yes, I guess it is because of inlined function. If there are several different instances at different addresses, perf probe tries to define probes for each address. > >Would be interesting to warn the user why multiple probes are being >created, no? Hmm, ok. it is usually done by probing inlined function, or the target line has multiple instructions. It may be better to show the reason why. >Alex, you can try using wildcards in this case, i.e.: > > perf record -e probe_libjvm:a* your-workload > >That if you don't have other probes in place starting with the same >prefix :-\ > >- Arnaldo > > >> objdump -t /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so|grep >> \.text|awk 'length($NF) == 63 {print length($NF)" "$NF}'|head -1 >> >> 63 _ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread >> >> >> >> perf probe -vvv -x /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so >> '_ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread' >> >> probe-definition(0): >> _ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread >> symbol:_ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread >> file:(null) line:0 offset:0 return:0 lazy:(null) >> 0 arguments >> Opening /sys/kernel/debug/tracing/uprobe_events write=1 >> Added new event: >> Writing event: >> p:probe_libjvm/_ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so:0x325a20 >> >> probe_libjvm:_ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread >> (on _ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread in >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so) >> >> You can now use it in all perf tools, such as: >> >> perf record -e >> probe_libjvm:_ZL34bulk_revoke_or_rebias_at_safepointP7oopDescbbP10JavaThread >> -aR sleep 1 >> >> >> >> perf probe -vvv -x /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so >> 'a=_Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_' >> >> probe-definition(0): >> a=_Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ >> symbol:_Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ >> file:(null) line:0 offset:0 return:0 lazy:(null) >> 0 arguments >> Opening /sys/kernel/debug/tracing/uprobe_events write=1 >> Added new events: >> Writing event: p:probe_libjvm/a >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so:0x8ca940 >> probe_libjvm:a (on >> _Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ in >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so) >> Writing event: p:probe_libjvm/a_1 >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so:0x9c07fe >> probe_libjvm:a_1 (on >> _Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ in >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so) >> Writing event: p:probe_libjvm/a_2 >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so:0x9c25c1 >> probe_libjvm:a_2 (on >> _Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ in >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so) >> >> You can now use it in all perf tools, such as: >> >> perf record -e probe_libjvm:a_2 -aR sleep 1 >> >> >> perf probe -l >> >> probe_libjvm:a (on >> _Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ in >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so) >> probe_libjvm:a_1 (on >> _Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ in >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so) >> probe_libjvm:a_2 (on >> _Z17do_write_prologueIP17GlobalTraceBufferEvR15JfrBufferWriterT_ in >> /opt/jdk1.8.0_60/jre/lib/amd64/server/libjvm.so) >> >> >> >> uname -a >> >> Linux vagrant-ubuntu-trusty-64 4.3.0-999-generic #201510112200 SMP Mon >> Oct 12 02:01:41 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux >> >> >> Thanks, >> >> Alex >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-perf-users" >> in >> the body of a message to majord...@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html