我可以访问 BCC(BPF 编译器集合)生成的中间 C 代码吗?
Can I access the intermediate C code generated by BCC (BPF Compiler Collection)?
我正在开发使用 BCC 进行内核跟踪的 eBPF 程序。一旦我在 运行 我的代码时收到以下错误消息:
/virtual/main.c:16:36: error: member reference type 'struct Qdisc *' is a pointer; did you mean to use '->'?
bpf_trace_printk("%ld\n", qdisc.limit);
~~~~~^
我知道我的代码有什么问题,而且很容易改正。但我注意到有一个名为 /virtual/main.c
的文件。我想 BCC 将传递给 Python 中的 BPF
对象的原始 C 代码转换为存储在名为 /virtual/main.c
的文件中的中间 C 代码。然后通过Clang
和LLVM
将中间C代码编译成BPF字节码,最终将BPF代码hook到内核中。
不知我的猜测是否正确。如果是,有什么办法可以看到存储在 /virtual/main.c
中的中间代码?我想知道 BCC 对我原来的代码做了什么修改。
非常感谢!
您可以通过将 DEBUG_PREPROCESSOR
传递给 BPF()
调用来告诉 bcc 转储重写的 C 代码。
BPF(..., debug=DEBUG_PREPROCESSOR)
我正在开发使用 BCC 进行内核跟踪的 eBPF 程序。一旦我在 运行 我的代码时收到以下错误消息:
/virtual/main.c:16:36: error: member reference type 'struct Qdisc *' is a pointer; did you mean to use '->'?
bpf_trace_printk("%ld\n", qdisc.limit);
~~~~~^
我知道我的代码有什么问题,而且很容易改正。但我注意到有一个名为 /virtual/main.c
的文件。我想 BCC 将传递给 Python 中的 BPF
对象的原始 C 代码转换为存储在名为 /virtual/main.c
的文件中的中间 C 代码。然后通过Clang
和LLVM
将中间C代码编译成BPF字节码,最终将BPF代码hook到内核中。
不知我的猜测是否正确。如果是,有什么办法可以看到存储在 /virtual/main.c
中的中间代码?我想知道 BCC 对我原来的代码做了什么修改。
非常感谢!
您可以通过将 DEBUG_PREPROCESSOR
传递给 BPF()
调用来告诉 bcc 转储重写的 C 代码。
BPF(..., debug=DEBUG_PREPROCESSOR)