• Sasha Goldshtein's avatar
    trace, argdist: Treat small USDT arguments correctly · 3a5256f1
    Sasha Goldshtein authored
    trace and argdist currently only work correctly for USDT arguments
    whose size is exactly 8 bytes. Smaller types, such as chars, shorts,
    ints (signed or unsigned) are not treated correctly. The reason is
    that the produced program would invoke the `bpf_usdt_readarg` helper
    with the address of a u64 local variable, and then cast that variable
    to the user-specified type derived from the format string. However,
    the `bpf_usdt_readarg` rewriting then passes `sizeof(u64)` to the
    generated `bpf_..._readarg` macro, which then fails to read anything
    because the provided size doesn't match the argument size it knows
    about.
    
    The fix is fairly easy: instead of declaring a u64 unconditionally
    and reading into that variable with `bpf_usdt_readarg`, declare a
    variable that has the correct type according to what we know about
    the USDT probe.
    3a5256f1
trace.py 30.4 KB