【问题标题】:Sending strings to BPF Map Space and printing them out将字符串发送到 BPF Map Space 并打印出来
【发布时间】:2021-10-03 15:11:41
【问题描述】:

我有一个小 txt 文件,我想在此处写入 BPF。这是我的 BPF 的 python 代码的样子,但我现在无法打印出任何东西。我一直以加载程序失败告终:带有一堆寄存器错误的无效参数。截至目前,我的字符串基本上说你好,世界,嗨

BPF_ARRAY(lookupTable, char, 512);
int helloworld2(void *ctx)
{
    //print the values in the lookup table
    #pragma clang loop unroll(full)
    for (int i = 0; i < 512; i++) {
        char *key = lookupTable.lookup(&i);
        if (key) {
            bpf_trace_printk("%s\n", key);
        }
    }
    return 0;
}

这是 Python 代码:

b = BPF(src_file="hello.c")

lookupTable = b["lookupTable"]
#add hello.csv to the lookupTable array
f = open("hello.csv","r")
file_contents = f.read()
#append file contents to the lookupTable array
b_string1 = file_contents.encode('utf-8')
b_string1 = ctypes.create_string_buffer(b_string1)
lookupTable[0] = b_string1
f.close()

b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="helloworld2")
b.trace_print()

我在这个 pastebin 中链接了错误,因为它太长了: BPF Error

一个值得注意的错误是提到检测到无限循环,这是我需要检查的内容。

【问题讨论】:

  • 您是否检查过 clang 是否真的展开了循环(bpftool prog dump xlated &lt;prog&gt; 一旦加载,或llvm-objdump -S &lt;objfile&gt;,但您不会拥有带有密件抄送的目标文件)?我怀疑它不会,因为您将指向i 的指针传递给lookupTable.lookup(&amp;i),这意味着i 中的值可能会在循环内部发生变化,并且您可能可能具有此无限环形。查找助手当然是只读的,但 clang 并不知道这一点。
  • 由于发送查找指针的性质,Clang 实际上无法展开循环。 @Pchaigno 的具有中介价值的解决方案似乎在使其真正发挥作用方面效果很好。

标签: bpf ebpf bcc-bpf


【解决方案1】:

问题在于i 是通过bpf_map_lookup_elem 中的指针传递的,因此编译器实际上无法展开循环(从它的角度来看,i 可能不会线性增加)。

使用中间变量就足以解决这个问题:

BPF_ARRAY(lookupTable, char, 512);
#define MAX_LENGTH 1
int helloworld2(void *ctx)
{
    //print the values in the lookup table
    #pragma clang loop unroll(full)
    for (int i = 0; i < 1; i++) {
        int k = i;
        char *key = lookupTable.lookup(&k);
        if (key) {
            bpf_trace_printk("%s\n", key);
        }
    }
    return 0;
}

【讨论】:

  • 感谢您的帮助!似乎已经修复了我的循环,但遗憾的是没有打印出来:(
  • 您是否检查过您的地图是否正确填充?你如何检查输出,你cat /sys/kernel/debug/tracing/trace_pipe
  • 我能够获得输出,但我必须解决 BPF 数组中每个字符的任意大小限制。
猜你喜欢
  • 2014-12-26
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
相关资源
最近更新 更多