我正在用下面的程序在内核中使用bpf
从task_strcut
中打印值pid
。
from __future__ import print_function
from bcc import BPF
prog = """
#include <linux/sched.h>
int trace(void *ctx) {
int pid = current->pid;
bpf_trace_printk("val (%d)", pid);
return 0;
}
"""
b = BPF(text=prog)
b.attach_kprobe(event="<a kernel function>", fn_name="trace")
print("PID MESSAGE")
try:
b.trace_print(fmt="{1} {5}")
except KeyboardInterrupt:
exit()
错误如下:
#define __HAVE_BUILTIN_BSWAP16__
^
<command line>:3:9: note: previous definition is here
#define __HAVE_BUILTIN_BSWAP16__ 1
^
3 warnings generated.
error: invalid operand in inline asm: 'movq %gs:${1:P}, $0' at line 2149017352
此错误已在上游通过密件抄送提交https://github.com/iovisor/bcc/commit/d089013e8c6ee0b82d012c1814f822b00695691f修复。需要密件抄送v0.20.0或更新的版本才能修复。
简而言之,问题在于定义的顺序。BCC将在内核之前有它的回退宏定义,因此编译失败,因为宏已经定义。移动bcc回退定义最后解决了这个问题。