在 Python 堆栈级别使用 eBPF 跟踪代码是否可行?

Is it feasible to use eBPF to trace code at the Python stack level?

非Linux平台上的dtrace长期以来一直被宣传能够动态检测node.js代码以在节点级别进行动态跟踪,例如允许在节点级别调试节点程序来自核心转储的 JavaScript 堆栈帧和变量(以及较低级别的跟踪)级别。

Linux 上的 eBPF 现在已经达到那个复杂程度了吗?我对 Python 特别感兴趣,但如果用任何类似的动态语言回答这个问题,我会考虑回答这个问题。

如果不是,还需要做些什么来支持它?

是的,您可以使用 BPF 和 USDT probes to trace Python scripts. You'll have to build your Python runtime with USDT probes

密件抄送包括 a few tracing scripts for Python。例如,您可以使用 pythoncalls.sh 打印前 2 个名为:

的方法
$ ./pythoncalls.sh -T 2 -p 26914
Tracing calls in process 26914 (language: python)... Ctrl-C to quit.

METHOD                                              # CALLS
<stdin>.<module>                                          1
<stdin>.fibo                                       14190928
^C

请注意,其他几个虚拟机支持 USDT 探测,例如 Java、Perl、PHP、Ruby 和 Tcl。