rubrikinc / wachy

A UI for eBPF-based performance debugging

Home Page:https://rubrikinc.github.io/wachy/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Offset outside the function bounds

xqms opened this issue · comments

Hey, great tool!

I'm seeing error messages like these whenever I try to trace a line with "x": (the initial tracepoint on main works)

Error: bpftrace command 'BEGIN { @start_time = nsecs; @depth[-1] = 0; @matched_retfilters[-1] = 0; } uprobe:/home/max/projects/uni/avatar/build/imgui_ros/devel/lib/imgui_ros/gui:main /@depth[tid] == 0/ { @start147[tid] = nsecs; @depth[tid] = 1; } uretprobe:/home/max/projects/uni/avatar/build/imgui_ros/devel/lib/imgui_ros/gui:main /@depth[tid] == 1/ { @duration_tmp147[tid] += (nsecs - @start147[tid]); $duration = @duration_tmp147[tid]; @count_tmp147[tid] += 1; delete(@start147[tid]); @depth[tid] = 0; if (@matched_retfilters[tid] == 0) { @duration171 += @duration_tmp171[tid]; @count171 += @count_tmp171[tid]; @duration147 += @duration_tmp147[tid]; @count147 += @count_tmp147[tid]; } delete(@duration_tmp171[tid]); delete(@count_tmp171[tid]); delete(@duration_tmp147[tid]); delete(@count_tmp147[tid]); delete(@matched_retfilters[tid]); } uprobe:/home/max/projects/uni/avatar/build/imgui_ros/devel/lib/imgui_ros/gui:main+1011 /@depth[tid] == 1/ { @start171[tid] = nsecs; } uprobe:/home/max/projects/uni/avatar/build/imgui_ros/devel/lib/imgui_ros/gui:main+1016 /@depth[tid] == 1 && @start171[tid]/ { @duration_tmp171[tid] += (nsecs - @start171[tid]); @count_tmp171[tid] += 1; delete(@start171[tid]); } interval:s:1 { printf("{\"time\": %d, \"lines\": {", (nsecs - @start_time) / 1000000000); printf("\"171\": [%lld, %lld], ", @duration171, @count171); printf("\"147\": [%lld, %lld]", @duration147, @count147); printf("}}\n"); }' failed, status: ExitStatus(ExitStatus(65280)), stderr:
ERROR: Offset outside the function bounds ('_ZZ4mainENKUlvE_clEv' size is 303)

Versions:

bpftrace v0.14.0-93-g625a
wachy 0.1.0-alpha.6

Do you have an idea what is going on here / what information I can provide?
The source code of the "gui" executable is here: https://github.com/xqms/imgui_ros. But I'll try to create a minimal example that triggers this problem.

Ah, maybe this is triggered when a function outside of the executable itself (e.g. shared library) is called?

For x it shouldn't matter whether the call is to a shared lib or not, we are just instrumenting the call instruction itself in the original function. It looks like bpftrace is interpreting the probe uprobe:...:main as referring to function _ZZ4mainENKUlvE_clEv which is

$ echo _ZZ4mainENKUlvE_clEv | c++filt
main::{lambda()#1}::operator()() const

Definitely not the same. Is the binary something that you can share? That would make it easiest to repro, otherwise I can also try to cook up the same error independently.

Never mind I see what the issue is. I don't see an option in bpftrace to disable this though, will open an upstream bug. As a workaround, the easiest option at this point is to just not use x in main (if you can move the code you're interested in, or even the whole body of main, to a new function it should work).

Ah ok, thank you ;)

If you need a repro case for the bpftrace bug:

#include <cstdio>

int main(int argc, char** argv)
{
    auto lambda = [](int i){
        printf("YES: %d\n", i);
    };

    for(int i = 0; i < 100; ++i)
        lambda(i);
    
    return 0;
}

compiled with g++ -g -std=c++17 -o test test.cpp exhibits the same bug (press x on the lambda(i) line).