【问题标题】:Debugging bpf and bpf jit调试 bpf 和 bpf jit
【发布时间】:2023-04-11 10:59:01
【问题描述】:

我写了一些 bpf 程序。我启用了echo "2" > /proc/sys/net/core/bpf_jit_enable,因此它在日志中输出生成的jitted 代码,但我在生成jitted 代码的qemu 环境中没有bpf_jit_disasm。 qemu 环境只有busybox,没有其他工具。

如何将qemu环境中生成的jitted输出传递给bpf_jit_disasm?我试过-f,但它需要一个JIT IMAGE。不知道这意味着什么。

还有什么其他方法可以调试 bpf 程序?

【问题讨论】:

    标签: linux bpf ebpf


    【解决方案1】:

    bpf_jit_enable 设置为 2,程序的 JIT-ed 映像应在程序加载成功时打印到内核日志。您应该能够简单地将其从内核日志复制粘贴到一个文件中,并将该文件提供给bpf_jit_disasm

    [编辑] 例如:

    # echo 2 > /proc/sys/net/core/bpf_jit_enable
    # cat /proc/sys/net/core/bpf_jit_enable
    2
    # bpftool prog load sample_ret0.o /sys/fs/bpf/foo type kprobe
    # dmesg
    [...]
    [5244802.925533] bpf_jit_enable = 2 was set! NEVER use this in production, only for JIT debugging!
    [5244815.524017] flen=133 proglen=678 pass=5 image=0000000000000000 from=sshd pid=1398988
    [5244815.618778] JIT code: 00000000: 0f 1f 44 00 00 55 48 89 e5 53 41 55 31 c0 45 31
    [5244815.708419] JIT code: 00000010: ed 48 89 fb 8b 43 04 be 3e 00 00 c0 48 39 f0 74
    [5244815.797957] JIT code: 00000020: 07 31 c0 41 5d 5b c9 c3 8b 43 00 48 83 f8 06 75
    ...
    [5244911.371176] JIT code: 000002a0: c0 e9 7d fd ff ff
    

    复制粘贴...

    $ cat sample_ret0.jit.txt
    [5244815.524017] flen=133 proglen=678 pass=5 image=0000000000000000 from=sshd pid=1398988
    [5244815.618778] JIT code: 00000000: 0f 1f 44 00 00 55 48 89 e5 53 41 55 31 c0 45 31
    [5244815.708419] JIT code: 00000010: ed 48 89 fb 8b 43 04 be 3e 00 00 c0 48 39 f0 74
    [5244815.797957] JIT code: 00000020: 07 31 c0 41 5d 5b c9 c3 8b 43 00 48 83 f8 06 75
    ...
    [5244911.371176] JIT code: 000002a0: c0 e9 7d fd ff ff
    
    $ wc sample_ret0.jit.txt
      148  2779 12521 sample_ret0.jit.txt
    
    $ bpf_jit_disasm -f sample_ret0.jit.txt
    15 bytes emitted from JIT compiler (pass:3, flen:2)
    ffffffffc10077f8 + <x>:
       0:   jmpq   0xfffffffffffffed3
       5:   cmp    $0x60,%rax
       9:   jne    0x0000000000000015
       b:   .byte 0xb8
       c:   add    %al,(%rax)
       e:   .byte 0xff
    

    还有其他几种检查 eBPF 程序的方法,尽管我不确定这些工具是否会在 busybox 上可用:

    • llvm-objdump (-S|-d) &lt;object file&gt; 在目标文件上(但仅适用于 eBPF 字节码,您不会得到 JIT 版图像)
    • bpftool prog dump (jited|xlated) &lt;prog ref&gt;(详见man bpftool-prog

    【讨论】:

    • 我尝试从内核日志中复制并输入它,但没有成功。您提到的工具在busybox环境中不可用。 ubuntu 也不允许 bpf_jit_enable = 2。默认情况下,它的 bpf_jit_enable = 1 并且它是不可变的,因此无法使用那里的工具。
    • 我尝试将内核日志中的复制粘贴到常规文件中,它对我来说效果很好。我正在更新我的答案,以防有帮助。
    • 这真的很有帮助。出于某种原因,我的标题是 [1124.718924] flen=25 proglen=109 pass=4 image=(____ptrval____) from=wtf pid=91。但是在你的图像中设置为 00000000。我从你的图像部分复制了它的工作。我认为我的 qemu setup linux 没有导致这种情况的所有驱动程序和依赖项。我想知道根据图像有什么变化吗?
    • 我不知道,我需要检查生成图像日志的代码。我只知道 bpf_jit_disasm 正在通过应用以下正则表达式来查找图像:flen=[[:alnum:]]+ proglen=[[:digit:]]+ pass=[[:digit:]]+ image=[[:xdigit:]]+,最后是 [[:xdigit:]],所以这必须是您通过替换为 0s 来解决的问题。
    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2021-04-10
    • 2014-08-21
    相关资源
    最近更新 更多