[lttng-dev] Trying to understand use of lttng enable-event --kernel --userspace-probe=

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu May 18 15:24:09 EDT 2023


On 2023-05-18 15:20, Brian Hutchinson wrote:
> On Thu, May 18, 2023 at 3:07 PM Brian Hutchinson <b.hutchman at gmail.com> wrote:
>>
>> On Thu, May 18, 2023 at 3:03 PM Mathieu Desnoyers
>> <mathieu.desnoyers at efficios.com> wrote:
>>>
>>> On 2023-05-18 14:58, Brian Hutchinson wrote:
>>>> On Thu, May 18, 2023 at 11:00 AM Brian Hutchinson <b.hutchman at gmail.com> wrote:
>>>>>
>>>>> On Thu, May 18, 2023 at 10:45 AM Mathieu Desnoyers
>>>>> <mathieu.desnoyers at efficios.com> wrote:
>>>>>>
>>>>>> On 2023-05-18 10:10, Brian Hutchinson wrote:
>>>>>> [...]
>>>>>>> I updated my hello world to have a function I'd like to use the
>>>>>>> --userspace-probe method on with the very original name of
>>>>>>> 'probe_function':
>>>>>>>
>>>>>>> #include <stdio.h>
>>>>>>> #include <lttng/tracef.h>
>>>>>>>
>>>>>>> void probe_function(int i);
>>>>>>>
>>>>>>> int main(int argc, char *argv[])
>>>>>>> {
>>>>>>>       unsigned int i;
>>>>>>>       puts("Hello, World!\nPress Enter to continue...");
>>>>>>>       /*
>>>>>>>        * The following getchar() call only exists for the purpose of this
>>>>>>>        * demonstration, to pause the application in order for you to have
>>>>>>>        * time to list its tracepoints. You don't need it otherwise.
>>>>>>>        */
>>>>>>>       getchar();
>>>>>>>
>>>>>>>       lttng_ust_tracef("Number %d, string %s", 23, "hi there!");
>>>>>>>       printf("Number %d, string %s", 23, "hi there!");
>>>>>>>
>>>>>>>       for (i = 0; i < argc; i++) {
>>>>>>>           lttng_ust_tracef("Number %d, argv %s", i, argv[i]);
>>>>>>>           printf("Number %d, argv %s", i, argv[i]);
>>>>>>>       }
>>>>>>>
>>>>>>>       puts("Quitting now!");
>>>>>>>
>>>>>>>       probe_function(i);
>>>>>>>
>>>>>>>       return 0;
>>>>>>> }
>>>>>>>
>>>>>>> void probe_function(int i) {
>>>>>>>
>>>>>>>       lttng_ust_tracef("Number %d, string %s", i * i, "i^2");
>>>>>>>       printf("Number %d, string %s", i * i, "i^2");
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> ... and I get the same error as before when I try to enable the probe:
>>>>>>> # lttng enable-event --kernel
>>>>>>> --userspace-probe=/usr/local/bin/hello:probe_function
>>>>>>> Error: Missing event name(s).
>>>>>>
>>>>>> As the error states, you are missing the event name. See
>>>>>>
>>>>>> man 1 lttng-enable-event
>>>>>>
>>>>>>           lttng [GENERAL OPTIONS] enable-event --kernel
>>>>>>                 [--probe=SOURCE | --function=SOURCE | --syscall |
>>>>>>                  --userspace-probe=SOURCE]
>>>>>>                 [--filter=EXPR] [--session=SESSION]
>>>>>>                 [--channel=CHANNEL] EVENT[,EVENT]...
>>>>>>
>>>>>>
>>>>>> You will want something like:
>>>>>>
>>>>>> lttng enable-event --kernel --userspace-probe=/usr/local/bin/hello:probe_function my_probe_function
>>>>>>
>>>>>> Where "my_probe_function" is the event name that will appear in the collected traces.
>>>>>
>>>>> Wow!  I must not have woken up this morning ha, ha.  Thanks for that!
>>>>> The event is enabled now.  Hope to actually get tracing data now.
>>>>
>>>> Well, I guess we just have the app that thwarts all attempts at tracing.
>>>>
>>>> I did a dynamic probe on several functions that should be getting
>>>> called like crazy and again I get no tracing data.
>>>>
>>>> Tried it with my hello world example above after Mathieu set me
>>>> straight on the event syntax and it works.
>>>>
>>>> I saw this comment in the documentation "As of this version, only USDT
>>>> probes that are not surrounded by a reference counter (semaphore) are
>>>> supported."
>>>>
>>>> I don't know that I can say that this function I'm probing isn't
>>>> "surrounded" by a reference counter, it's in a large multi-threaded
>>>> application so I guess it's possible.
>>>>
>>>> Sigh, I'm striking out every which way.
>>>>
>>>> No offense (since this is lttng list - please don't flame me ... I
>>>> want/need lttng), but I think I'm going to try just straight kprobes
>>>> and uprobes and see if trace compass can show those traces in an
>>>> attempt to get "something/anything" working.
>>>
>>> If you attach to an ELF symbol (function), then there is no USDT in
>>> play, so it should not be related to the issue you have.
>>
>> That is what I was thinking which is why I wanted to try it.
>>
>>>
>>> But if your functions happen to be inlined, then there will be nothing
>>> to attach to. Perhaps this is what happens there ?
>>
>> I don't see any evidence of anything being inlined in this module.  I
>> grepped the code to verify.
>>
>> Back to being stumped/stuck.
> 
> I can do trace-cmd stuff and it works.  The hello world above works so
> I don't "think" this is a problem but again in full disclosure I'll
> mention/ask about it.
> 
> Does any of the lttng tools/libs depend on kernel headers?  I ask
> because old yocto (Dunfell) built lttng package against a 4.something
> kernel and we're running a 5.10.69 kernel that lttng modules were
> added to it with the "builtin" script and built that way.
> 
> Should probably have yocto build the local kernel too, but kernel is
> being built stand alone due to vendor stuff that hasn't been mainlined
> yet.
> 
> I'm running out of things to think about that could be the issue.

If lttng-modules can trace your smaller test application through 
uprobes, then the problem is likely elsewhere.

Only lttng-modules has dependencies on kernel headers. lttng-tools/ust 
don't depend on kernel headers.

Mathieu


-- 
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com



More information about the lttng-dev mailing list