我用libbpf写了一个bpf程序来观察文件打开的动作。我使用BPF_MAP_TYPE_QUEUE传递路径名。它似乎工作,但不是正常的。
libbpf: elf: skipping unrecognized data section(8) .rodata.str1.16
libbpf: elf: skipping unrecognized data section(22) .eh_frame
libbpf: elf: skipping relo section(23) .rel.eh_frame for section(22) .eh_frame
libbpf: Error in bpf_create_map_xattr(queue_map):Invalid argument(-22). Retrying without BTF.
******Loop times 0 ******
******Loop times 1 ******
pid=3478152 cmd=titan_monitor pathname=
pid=3478152 cmd=titan_monitor pathname=/
pid=3478152 cmd=titan_monitor pathname=uptime
pid=3478152 cmd=titan_monitor pathname=stat
pid=6311 cmd=python pathname=cmdline
pid=6311 cmd=python pathname=proc
pid=6311 cmd=python pathname=sem.1NGcnv
pid=6311 cmd=python pathname=sem.xW06WV
pid=6311 cmd=python pathname=sem.9GYRMO
pid=6311 cmd=python pathname=sem.a5psds
ç******Loop times 2 ******
pid=3478176 cmd=titanagent pathname=
pid=3478152 cmd=titan_monitor pathname=urandom
pid=3478152 cmd=titan_monitor pathname=/
pid=3478152 cmd=titan_monitor pathname=uptime
pid=3478152 cmd=titan_monitor pathname=stat
pid=3478152 cmd=titan_monitor pathname=cmdline
pid=3478152 cmd=titan_monitor pathname=/
pid=3478152 cmd=titan_monitor pathname=uptime
pid=3478152 cmd=titan_monitor pathname=stat
字符串
它在循环中每次都丢失第一个值。
166 //print out
167 signal(SIGINT, do_quit);
168 int count = 0;
169 while (!quit) {
170 int key = 0;
171 unsigned long long val;
172 struct hash_key hkey = {}, nhkey= {};
173
174 printf("******Loop times %d ******\n", count);
175 count++;
176 memset(&nhkey, 0, sizeof(hkey));
177 while (bpf_map_lookup_and_delete_elem(queue_map_fd, 0, &nhkey) == 0) {
178 printf("pid=%d \t\t cmd=%s \t\t pathname=%s\n",
179 (__u32) nhkey.pid, nhkey.comm, hkey.pathname);
180 //print_stack(&nhkey, stack_map_fd);
181 hkey = nhkey;
182 //usleep(1000000);
183 }
184
185 usleep(1000000);
186 }
37 struct {
38 __uint(type, BPF_MAP_TYPE_QUEUE);
39 __type(value, struct hash_key);
40 __uint(max_entries, 10);
41 } queue_map SEC(".maps");
的数据
怎么处理这个
1条答案
按热度按时间8ljdwjyq1#
libbpf:bpf_create_map_xattr(队列Map)中出错:参数无效(-22).正在不使用BTF的情况下重试。
因此,它最初加载失败,但在没有BTF的情况下重试是有效的,否则程序将退出。我不能100%肯定,但相信这种机制存在,因为旧的内核不支持提供Map的BTF信息。如果是这样的话,警告/错误应该会在更新的内核上消失,否则BTF本身可能有问题,但我不能从提供的信息中判断出来。
它每次在循环中丢失第一个值。
正在复制参考代码
字符串
如果您在
while(!quit)
循环的每个反覆运算中遵循下列程式码:struct hash_key hkey = {}, nhkey= {};
hkey和nhkey都被初始化。memset(&nhkey, 0, sizeof(hkey));
hkey被置零1.内部循环
bpf_map_lookup_and_delete_elem(queue_map_fd, 0, &nhkey)
的第一次迭代使用map值填充nhkey
printf("pid=%d \t\t cmd=%s \t\t pathname=%s\n",179 (__u32) nhkey.pid, nhkey.comm, hkey.pathname);
则打印具有值nhkey.pid
和nhkey.comm
。还有hkey.pathname
,但hkey
仍然是零,所以它没有打印。hkey = nhkey;
,然后将nhkey
复制到hkey
,这样下一个迭代hkey
就有了一个值,但它是上一个迭代的值。因此,除非您将其用于其他用途,否则应该从代码中删除
hkey
,并将打印行替换为:printf("pid=%d \t\t cmd=%s \t\t pathname=%s\n", 179 (__u32) nhkey.pid, nhkey.comm, nhkey.pathname);
个型