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

Brian Hutchinson b.hutchman at gmail.com
Thu May 18 10:10:37 EDT 2023


On Thu, May 18, 2023 at 9:17 AM Brian Hutchinson <b.hutchman at gmail.com> wrote:
>
> On Wed, May 17, 2023 at 12:08 PM Mathieu Desnoyers
> <mathieu.desnoyers at efficios.com> wrote:
> >
> > On 2023-05-16 22:11, Brian Hutchinson via lttng-dev wrote:
> > > Hi,
> > >
> > > I'm trying to figure out how to use uprobes with lttng.
> > >
> > > I can't use a normal uprobe for a line number just using the address I
> > > want to probe obtained from objdump?  As in:
> > >
> > > echo 'p /usr/local/bin/my_app:0x2c3a8' >>
> > > /sys/kernel/debug/tracing/uprobe_events
> > >
> > > ... which isn't a function entry, it's just a line of code I want to probe on.
> > >
> > > This link says it has to be elf or sdt:
> > > https://lttng.org/man/1/lttng-enable-event/v2.11/#doc-opt--userspace-probe
> > >
> > > So can I not probe on just a line of code by specifying an address???
> > >
> > > It doesn't look like these methods above will do what I'm wanting to
> > > do.  I've tried to find examples of using enable-event --kernel
> > > --userspace-probe= but there doesn't appear to be many.
> > >
> >
> > There are examples here:
> >
> > https://lttng.org/docs/v2.13/#doc-enabling-disabling-events
>
> I added a function that's called when the event I want to probe occurs.
>
> I tried to enable the event with:
> root at localhost:/usr/local/bin# lttng enable-event --kernel
> --userspace-probe=/usr/local/bin/my_app:my_probe_event
> Error: Missing event name(s).
>
> ... and:
>
> root at localhost:/usr/local/bin# lttng enable-event --kernel
> --userspace-probe=elf:/usr/local/bin/my_app:my_probe_event
> Error: Missing event name(s).
>
> I can do ${CROSS_COMPILE}objdump -d and verify that the symbol above
> for the function I added is indeed there.
>
> What am I doing wrong?
>

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).

More system details below:


$ cat hello_objdump.txt

hello:     file format elf64-littleaarch64

SYMBOL TABLE:
0000000000000238 l    d  .interp        0000000000000000              .interp
0000000000000254 l    d  .note.gnu.build-id     0000000000000000
       .note.gnu.build-id
0000000000000278 l    d  .note.ABI-tag  0000000000000000
.note.ABI-tag
0000000000000298 l    d  .gnu.hash      0000000000000000              .gnu.hash
00000000000002b8 l    d  .dynsym        0000000000000000              .dynsym
00000000000004c8 l    d  .dynstr        0000000000000000              .dynstr
00000000000005ee l    d  .gnu.version   0000000000000000
.gnu.version
0000000000000620 l    d  .gnu.version_r 0000000000000000
.gnu.version_r
0000000000000660 l    d  .rela.dyn      0000000000000000              .rela.dyn
00000000000007b0 l    d  .rela.plt      0000000000000000              .rela.plt
0000000000000918 l    d  .init  0000000000000000              .init
0000000000000930 l    d  .plt   0000000000000000              .plt
0000000000000a40 l    d  .text  0000000000000000              .text
0000000000001194 l    d  .fini  0000000000000000              .fini
00000000000011a8 l    d  .rodata        0000000000000000              .rodata
00000000000013f0 l    d  .eh_frame_hdr  0000000000000000
.eh_frame_hdr
0000000000001468 l    d  .eh_frame      0000000000000000              .eh_frame
0000000000011d78 l    d  .init_array    0000000000000000
.init_array
0000000000011d88 l    d  .fini_array    0000000000000000
.fini_array
0000000000011d98 l    d  .dynamic       0000000000000000              .dynamic
0000000000011f98 l    d  .got   0000000000000000              .got
0000000000011fe8 l    d  .got.plt       0000000000000000              .got.plt
0000000000012078 l    d  .data  0000000000000000              .data
00000000000120d8 l    d  .bss   0000000000000000              .bss
0000000000000000 l    d  .comment       0000000000000000              .comment
0000000000000000 l    d  .debug_aranges 0000000000000000
.debug_aranges
0000000000000000 l    d  .debug_info    0000000000000000
.debug_info
0000000000000000 l    d  .debug_abbrev  0000000000000000
.debug_abbrev
0000000000000000 l    d  .debug_line    0000000000000000
.debug_line
0000000000000000 l    d  .debug_str     0000000000000000              .debug_str
0000000000000000 l    d  .debug_loc     0000000000000000              .debug_loc
0000000000000000 l    d  .debug_ranges  0000000000000000
.debug_ranges
0000000000000000 l    df *ABS*  0000000000000000              abi-note.S
0000000000000000 l    df *ABS*  0000000000000000              start.S
0000000000000000 l    df *ABS*  0000000000000000              init.c
0000000000000000 l    df *ABS*  0000000000000000              crti.S
0000000000000a78 l     F .text  0000000000000014              call_weak_fn
0000000000000000 l    df *ABS*  0000000000000000              crtn.S
0000000000000000 l    df *ABS*  0000000000000000              crtstuff.c
0000000000000a90 l     F .text  0000000000000000
deregister_tm_clones
0000000000000ac0 l     F .text  0000000000000000              register_tm_clones
0000000000000b00 l     F .text  0000000000000000
__do_global_dtors_aux
00000000000120d8 l     O .bss   0000000000000001              completed.9125
0000000000011d88 l     O .fini_array    0000000000000000
__do_global_dtors_aux_fini_array_entry
0000000000000b50 l     F .text  0000000000000000              frame_dummy
0000000000011d78 l     O .init_array    0000000000000000
__frame_dummy_init_array_entry
0000000000000000 l    df *ABS*  0000000000000000              hello.c
0000000000000b54 l     F .text  0000000000000120
lttng_ust_tracepoint__init_urcu_sym
0000000000000c74 l     F .text  0000000000000028
lttng_ust_tracepoint_logging_debug_enabled
0000000000000c9c l     F .text  000000000000007c
lttng_ust_tracepoints_print_disabled_message
00000000000013c0 l     O .rodata        000000000000002d
__func__.5512
0000000000000d18 l     F .text  00000000000000e8
lttng_ust__tracepoints__init
0000000000000e00 l     F .text  0000000000000170
lttng_ust__tracepoints__destroy
0000000000000000 l    df *ABS*  0000000000000000              elf-init.c
0000000000000000 l    df *ABS*  0000000000000000              crtstuff.c
0000000000001610 l     O .eh_frame      0000000000000000
__FRAME_END__
0000000000000000 l    df *ABS*  0000000000000000
0000000000011d88 l       .init_array    0000000000000000
__init_array_end
0000000000011d98 l     O *ABS*  0000000000000000              _DYNAMIC
0000000000011d78 l       .init_array    0000000000000000
__init_array_start
00000000000013f0 l       .eh_frame_hdr  0000000000000000
__GNU_EH_FRAME_HDR
0000000000011f98 l     O *ABS*  0000000000000000
_GLOBAL_OFFSET_TABLE_
0000000000000918 l     F .init  0000000000000000              _init
0000000000001190 g     F .text  0000000000000004              __libc_csu_fini
0000000000000000  w      *UND*  0000000000000000
_ITM_deregisterTMCloneTable
0000000000012078  w      .data  0000000000000000              data_start
00000000000120f0  w    O .bss   0000000000000008              .hidden
lttng_ust_tracepoint_destructors_syms_ptr
00000000000120d8 g       .bss   0000000000000000              __bss_start__
0000000000000000  w    F *UND*  0000000000000000
__cxa_finalize@@GLIBC_2.17
0000000000000000       O *UND*  0000000000000000              stderr@@GLIBC_2.17
0000000000000000       F *UND*  0000000000000000
dlclose@@GLIBC_2.17
00000000000120f8 g       .bss   0000000000000000              _bss_end__
00000000000120d8 g       .data  0000000000000000              _edata
0000000000000000       F *UND*  0000000000000000              dlopen@@GLIBC_2.17
0000000000001194 g     F .fini  0000000000000000              .hidden _fini
00000000000120f8 g       .bss   0000000000000000              __bss_end__
0000000000000000       F *UND*  0000000000000000              getpid@@GLIBC_2.17
0000000000000000       F *UND*  0000000000000000              dlsym@@GLIBC_2.17
0000000000000000       F *UND*  0000000000000000
__libc_start_main@@GLIBC_2.17
0000000000000000       F *UND*  0000000000000000              memset@@GLIBC_2.17
00000000000120e8  w    O .bss   0000000000000008              .hidden
lttng_ust_tracepoint_dlopen_ptr
0000000000012078 g       .data  0000000000000000              __data_start
0000000000000000  w      *UND*  0000000000000000              __gmon_start__
0000000000012080 g     O .data  0000000000000000              .hidden
__dso_handle
00000000000120c0  w    O .data  0000000000000018              .hidden
lttng_ust_tracepoint_destructors_syms
0000000000000000       F *UND*  0000000000000000              abort@@GLIBC_2.17
00000000000120e4  w    O .bss   0000000000000004              .hidden
lttng_ust_tracepoint_ptrs_registered
00000000000011a8 g     O .rodata        0000000000000004
_IO_stdin_used
0000000000012088  w    O .data  0000000000000038              .hidden
lttng_ust_tracepoint_dlopen
0000000000000000       F *UND*  0000000000000000              puts@@GLIBC_2.17
00000000000120e0  w    O .bss   0000000000000004              .hidden
lttng_ust_tracepoint_registered
0000000000001110 g     F .text  000000000000007c              __libc_csu_init
00000000000120f8 g       .bss   0000000000000000              _end
0000000000000a40 g     F .text  0000000000000000              _start
0000000000000000       F *UND*  0000000000000000
getchar@@GLIBC_2.17
00000000000120f8 g       .bss   0000000000000000              __end__
00000000000120d8 g       .bss   0000000000000000              __bss_start
0000000000000f70 g     F .text  000000000000012c              main
000000000000109c g     F .text  0000000000000074              probe_function
0000000000000000       O *UND*  0000000000000000
lttng_ust_tracepoint_lttng_ust_tracef___event
00000000000120d8 g     O .data  0000000000000000              .hidden
__TMC_END__
0000000000000000  w      *UND*  0000000000000000
_ITM_registerTMCloneTable
0000000000000000       F *UND*  0000000000000000              printf@@GLIBC_2.17
0000000000000000       F *UND*  0000000000000000              getenv@@GLIBC_2.17
0000000000000000       F *UND*  0000000000000000
fprintf@@GLIBC_2.17
0000000000000000       F *UND*  0000000000000000              lttng_ust__tracef

# zcat /proc/config.gz | grep -i probe
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_KPROBES=y
CONFIG_UPROBES=y
CONFIG_KRETPROBES=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
CONFIG_GENERIC_CPU_AUTOPROBE=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_TIMER_PROBE=y
CONFIG_KPROBE_EVENTS=y
# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set
CONFIG_UPROBE_EVENTS=y
CONFIG_PROBE_EVENTS=y
# CONFIG_KPROBE_EVENT_GEN_TEST is not set
# CONFIG_KPROBES_SANITY_TEST is not set


> >
> > Indeed inserting a lttng-modules uprobe within functions is not
> > supported at the moment, mainly because we prefer to err towards safety
> > and don't have the validation in place to prevent corrupting the
> > program's instructions if an end user would try to insert a uprobe at an
> > address which is not an instruction boundary.
> >
> > So we only support inserting uprobe on functions and SDT probes at
> > the moment.
> >
> > Thanks,
> >
> > Mathieu
> >
> >
> > > Thanks,
> > >
> > > Brian
> > > _______________________________________________
> > > lttng-dev mailing list
> > > lttng-dev at lists.lttng.org
> > > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
> >
> > --
> > Mathieu Desnoyers
> > EfficiOS Inc.
> > https://www.efficios.com
> >


More information about the lttng-dev mailing list