Linux 调试bpf和bpf jit

Linux 调试bpf和bpf jit,linux,bpf,ebpf,Linux,Bpf,Ebpf,我写了一些bpf程序。我已经启用了echo“2”>/proc/sys/net/core/bpf\u jit\u enable,因此它在日志中输出生成的jitted代码,但我在生成jitted代码的qemu环境中没有bpf\u jit\u disasm。qemu环境只有busybox,没有其他工具 如何获取qemu环境中生成的jitted输出并将其传递给bpf\u jit\u disasm?我尝试了-f,但它需要一个JIT映像。不知道那是什么意思 还有什么其他方法可以调试bpf程序?如果bpf\u

我写了一些bpf程序。我已经启用了
echo“2”>/proc/sys/net/core/bpf\u jit\u enable
,因此它在日志中输出生成的jitted代码,但我在生成jitted代码的qemu环境中没有
bpf\u jit\u disasm
。qemu环境只有busybox,没有其他工具

如何获取qemu环境中生成的jitted输出并将其传递给
bpf\u jit\u disasm
?我尝试了
-f
,但它需要一个JIT映像。不知道那是什么意思


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

如果
bpf\u jit\u enable
设置为2,程序的jit图像应在成功加载程序时打印到内核日志中。您应该能够简单地将它从内核日志复制粘贴到一个文件中,并将该文件提供给
bpf\u jit\u 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
$cat sample\u ret0.jit.txt
[5244815.524017]flen=133 proglen=678 pass=5 image=0000000000000000 from=sshd pid=1398988
[5244815.618778]JIT代码:00000000:0f 1f 44 00 00 55 48 89 e5 53 41 55 31 c0 45 31
[5244815.708419]JIT代码:00000010:ed 48 89 fb 8b 43 04 be 3e 00 00 c0 48 39 f0 74
[5244815.797957]JIT代码:00000020:07 31 c0 41 5d 5b c9 c3 8b 43 00 48 83 f8 06 75
...
[5244911.371176]JIT代码:000002a0:c0 e9 7d fd ff
$wc sample_ret0.jit.txt
148 2779 12521 sample_ret0.jit.txt
$bpf_jit_disasm-f sample_ret0.jit.txt
从JIT编译器发出的15个字节(pass:3,flen:2)
FFFFFFFF C10077F8+:
0:jmpq 0xfffffffffffed3
5:cmp$0x60,%rax
9:jne 0x0000000000000015
b:.字节0xb8
c:添加%al,(%rax)
e:.字节0xff
检查eBPF程序还有其他几种方法,尽管我不确定busybox上是否有这些工具:

  • 对象文件上的llvm objdump(-S |-d)(但仅对于eBPF字节码,您将无法获得JIT-ed映像)
  • bpftool程序转储(jited | xlated)
    (有关详细信息,请参阅)

我尝试过从内核日志复制并提供给它,但没有成功。您提到的工具在busybox环境中不可用。此外,ubuntu不允许bpf_jit_enable=2。默认情况下,它的bpf_jit_enable=1,并且它是不可变的,因此无法使用那里的工具。我尝试将粘贴从内核日志复制到一个常规文件,它对我来说效果很好。我正在更新我的答案,以防万一。这真的很有帮助。出于某种原因,我的标题是[1124.718924]flen=25 proglen=109 pass=4 image=(\uuuuuuuuu ptrval\uuuuuuuuuu)from=wtf pid=91。但在你的图像中设置为00000000。我复制了你的图像部分,它工作了。我认为我的qemu安装linux并没有所有的驱动程序和依赖项,这是造成这种情况的原因。我想知道是否有任何变化根据图像?我不知道,我需要检查代码,生成图像日志。我只知道bpf_jit_disasm是通过应用以下正则表达式来寻找图像的:
flen=[[:alnum:]+proglen=[:digit:]+pass=[:digit:]+image=[:xdigit:]+
,最后加上一个
[:xdigit:]
,所以这一定是您用
0
s替换的结果。