linux 如何处理这个libbpf:bpf_create_map_xattr(queue_map)中出错:参数无效(-22)

ukdjmx9f  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(205)

我用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");

的数据
怎么处理这个

8ljdwjyq

8ljdwjyq1#

libbpf:bpf_create_map_xattr(队列Map)中出错:参数无效(-22).正在不使用BTF的情况下重试。
因此,它最初加载失败,但在没有BTF的情况下重试是有效的,否则程序将退出。我不能100%肯定,但相信这种机制存在,因为旧的内核不支持提供Map的BTF信息。如果是这样的话,警告/错误应该会在更新的内核上消失,否则BTF本身可能有问题,但我不能从提供的信息中判断出来。
它每次在循环中丢失第一个值。
正在复制参考代码

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     }

字符串
如果您在while(!quit)循环的每个反覆运算中遵循下列程式码:

  1. struct hash_key hkey = {}, nhkey= {}; hkey和nhkey都被初始化。
  2. memset(&nhkey, 0, sizeof(hkey)); hkey被置零
    1.内部循环bpf_map_lookup_and_delete_elem(queue_map_fd, 0, &nhkey)的第一次迭代使用map值填充nhkey
  3. printf("pid=%d \t\t cmd=%s \t\t pathname=%s\n",179 (__u32) nhkey.pid, nhkey.comm, hkey.pathname);则打印具有值nhkey.pidnhkey.comm。还有hkey.pathname,但hkey仍然是零,所以它没有打印。
  4. 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);
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 nhkey= {};
173
174         printf("******Loop times %d ******\n", count);
175         count++;
176         while (bpf_map_lookup_and_delete_elem(queue_map_fd, 0, &nhkey) == 0) {
177             printf("pid=%d  \t\t    cmd=%s  \t\t   pathname=%s\n",
178                         (__u32) nhkey.pid,  nhkey.comm,  nhkey.pathname);
179         }
180
181         usleep(1000000);
182     }

相关问题