- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在关注这个 link将 BPF 程序附加到用户空间探测器,Dtrace 格式(请参阅用户静态定义的跟踪点部分)。
C 程序:
#include <sys/sdt.h>
int main() {
DTRACE_PROBE("hello-usdt", "probe-main");
}
确保包含探测信息的检查:
readelf -n hello_usdt
stapsdt 0x00000033 NT_STAPSDT (SystemTap probe descriptors)
Provider: "hello_usdt"
Name: "probe-main"
Location: 0x0000000000400535, Base: 0x00000000004005d4, Semaphore: 0x0000000000000000
Arguments:
还有 tplist:
sudo /usr/share/bcc/tools/tplist -l /path/to/hello_usdt
/path/to/hello_usdt "hello_usdt":"probe-main"
BPF程序(usdt.py)的内容:
from bcc import BPF, USDT
bpf_source = """
#include <uapi/linux/ptrace.h>
int trace_binary_exec(struct pt_regs *ctx) {
u64 pid = bpf_get_current_pid_tgid();
bpf_trace_printk("New hello_usdt process running with PID: %d", pid);
}
"""
usdt = USDT(path = "./hello_usdt")
usdt.enable_probe(probe = "probe-main", fn_name = "trace_binary_exec")
bpf = BPF(text = bpf_source, usdt = usdt)
bpf.trace_print()
故障描述:
sudo ./usdt.py
Traceback (most recent call last):
File "./usdt.py", line 13, in <module>
usdt.enable_probe(probe = "probe-main", fn_name = "trace_binary_exec")
File "/usr/lib/python3/dist-packages/bcc/usdt.py", line 154, in enable_probe
probe
bcc.usdt.USDTException: failed to enable probe 'probe-main';
a possible cause can be that the probe requires a pid to enable
我也尝试过:
usdt = USDT(path = "/full/path/to/hello_usdt")
usdt = USDT(pid=1234)
到目前为止运气不好。非常感谢任何帮助。谢谢。
最佳答案
我想我弄清楚了原始链接中的错误。我修补了 bcc-tools 的源文件(函数 bcc_usdt_enable_probe 和更深层次),使用一些 printfs 编译并安装了这个自定义版本以跟踪它失败的原因,结果在解析探测器列表时,我的程序中定义的探测器被视为带有附加引号的字符串,类似于:““probe-main””。所以我更换了这一行:
DTRACE_PROBE("hello-usdt", "probe-main");
与
DTRACE_PROBE("hello-usdt", probe-main);
我做的第二个改变是在 python 脚本中。我没有详细说明,但看起来这一行是错误的(语法):
bpf = BPF(text = bpf_source, usdt = usdt)
python 编译器提示 usdt 未知,然后我发现其他实现使用 usdt_contexts=[usdt]。所以我将上面的行替换为:
bpf = BPF(text = bpf_source, usdt_contexts = [usdt])
然后在源代码中替换了探测宏以包含一个额外的时间戳:
DTRACE_PROBE1("hello_usdt", probe-main, tv.tv_sec);
同时更新了 python 脚本:
#!/usr/bin/python3
from bcc import BPF, USDT
bpf_source = """
#include <uapi/linux/ptrace.h>
int trace_binary_exec(struct pt_regs *ctx) {
u64 pid = bpf_get_current_pid_tgid();
u64 ts=0;
bpf_usdt_readarg(1, ctx, &ts);
bpf_trace_printk("PROBE-HIT (PID: %d), TS: %lu\\n", pid, ts);
}
"""
usdt = USDT(path = "/path/to/hello_usdt")
usdt.enable_probe(probe = "probe-main", fn_name = "trace_binary_exec")
bpf = BPF(text = bpf_source, usdt_contexts = [usdt])
bpf.trace_print()
让它运行起来:
sudo ./usdt.py
b' hello_usdt-18920 [000] .... 300066.568941: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460390'
b' hello_usdt-18920 [000] .... 300067.569284: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460391'
b' hello_usdt-18920 [000] .... 300068.569509: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460392'
b' hello_usdt-18920 [000] .... 300069.569935: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460393'
b' hello_usdt-18920 [000] .... 300070.570362: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460394'
b' hello_usdt-18920 [000] .... 300083.574478: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460407'
b' hello_usdt-18920 [000] .... 300084.574782: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460408'
b' hello_usdt-18920 [000] .... 300085.575214: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460409'
b' hello_usdt-18920 [000] .... 300086.575630: 0x00000001: PROBE-HIT (PID: 18920), TS: 1593460410'
我不知道为什么原始链接中的实现不同。可能是 BPF/Dtrace 版本的问题,没有详细说明。但是,我没有找到涵盖基于 C 的基本程序的所有步骤的其他实现,但找到了帮助我解决问题的片段。
关于linux - 在 Linux 中使用 USDT 探针 (Dtrace) 获取 BPF 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62641551/
这是东西吗? 我有一些遗留服务,这些服务永远不会在Kubernetes中运行,通过定义服务并手动上载终结点对象,这些服务目前对群集可用。 但是,服务是水平分片的,我们经常需要重新启动其中一个端点。我的
我是 Kubenetes 新手,想澄清以下问题。 假设我们有一个在 k8s 中运行的容器化 java 程序(使用 docker)。当 JVM 消耗的堆大小达到限制时,我需要停止向 pod 发送请求。为
我正在使用 Varnish 在两台服务器之间进行负载平衡,并且我已经设置了一个 Controller 和两个后端,它们正在成功地完成此操作。 我的问题是我的两个后端正在 my.domain.com 的
我有一个不是网络服务的微服务。 它是一个 Spring Boot (1.5) CommandLineRunner 应用程序,不需要公开 API 或对 http 执行任何操作。 但是,我需要对 Kube
有 runocc.d dtrace 脚本可以打印每个处理器的运行队列。我需要在 Mac OS X 上的 C++ 程序中获取运行队列长度。是否有可能以某种方式将 dtrace 构造嵌入到 C++ 程序中
我们在 Tomcat 5.5.17 上部署的网络应用程序在 Sun VM 1.5.0_06-b05 上运行时遇到了一些速度变慢的问题,并且我们的托管公司没有提供足够的数据来发现问题。 我们正在考虑安装
我的想法是将 liveness probe 实现为命令,并使用类似的东西 $ grep something ERROR 从 pod 内部,因此如果在 pod 的输出中存在包含 ERROR 的行,则 l
如何使用 Spring JPA 的 Query by Example不仅查询实体本身,还使用 findAll() 查询相关实体的属性?当在探针/示例实体上设置相关实体属性时,我们所有的尝试似乎
这个问题已经有答案了: Internet Explorer 11 JavaScript Let Statement (1 个回答) 已关闭 3 年前。 我正在动态创建一个像这样的对象数组: let s
所以我正在关注这个 link将 BPF 程序附加到用户空间探测器,Dtrace 格式(请参阅用户静态定义的跟踪点部分)。 C 程序: #include int main() { DTRACE
我有一个只使用来自 Rabbit MQ 的消息的项目,我正在使用 网络核心 2.1。 .我只是创建了一个带有托管服务的“控制台应用程序”,一切正常。 现在我需要将它部署到 Openshift 并配置
我正在编写一个 grpc 服务并在 Kubernetes (https://github.com/grpc-ecosystem/grpc-health-probe) 上使用 gRPC 健康检查。在我的
import time import datetime import argparse import netaddr import sys import logging from scapy.all
我是一名优秀的程序员,十分优秀!