Nettrace 源码分析

开源工具学习记录之流程梳理

近期对腾讯的的开源项目: nettrace(网络故障分析工具) ,进行源码学习。
开源仓库:Nettrace开源仓库
开源工具实现注释:nettrace学习记录

Nettrace 源码分析

nettrace数据分析模块主要涉及到以下几个文件中的源码:

  • nettrace.c
  • trace.c,trace.h
  • analysis.c,analysis.h
  • trace_group.c

在这里插入图片描述

1. 数据采集模块

详细分析:Nettrace数据采集方法研究

1.1 main()入口函数

nettrace.cmain()函数中,实现了从初始化跟踪数组, 到准备跟踪环境,再到加载并附加bpf程序, 最终通过trace_poll函数启动网络数据监听与数据处理;

在这里插入图片描述

int main(int argc, char *argv[])
{
   
   
	/*1.初始化跟踪组*/
	init_trace_group();
    /*2.参数解析*/
	do_parse_args(argc, argv);
	/*3.跟踪点有效性标记*/
	if (trace_prepare())
		goto err;
	/*4.加载并附加eBPF程序*/
	if (trace_bpf_load_and_attach()) {
   
   
		pr_err("failed to load bpf\n");
		goto err;
	}

	signal(SIGTERM, do_exit);
	signal(SIGINT, do_exit);

	pr_info("begin trace...\n");
	/*5.启动网络追踪功能*/
	trace_poll(trace_ctx);
	do_exit(0);
	return 0;
err:
	return -1;
}
1.1.1初始化跟踪组

在项目编译过程中,会通过gen_trace.py脚本去解析trace.yaml文件,生成trace_group.ckprobe_trace.h文件,前者定义了所有的挂载点以及跟踪点链表, 并组建成了跟踪点树, 后者对所有的挂载点定义了其索引;

                               nettrace.c ----------------- nettrace
                                  trace.c                       |
                                    xxxxx                       |
                                                                |
                                                                |
                            trace_group.c                       ||
trace.yaml -- gen_trace.py                                      ||
                            kprobe_trace.h                      ||
                                            kprobe.o → kprobe.skel.h
                                          ╱
                                  kprobe.c

trace_group.c文件中依靠init_trace_group()函数初始化了跟踪组,将项目所涉及的所有跟踪点构建成树的形式;

trace_group_t root_group = {
   
   
	.name = "all",
	.desc = "trace the whole kernel network stack",
	.children = LIST_HEAD_INIT(root_group.children),
	.traces = LIST_HEAD_INIT(root_group.traces),
	.list = LIST_HEAD_INIT(root_group.list),
};
trace_group_t group_link = {
   
   
	.name = "link",
	.desc = "link layer (L2) of the network stack",
	.children = LIST_HEAD_INIT(group_link.children),
	.traces = LIST_HEAD_INIT(group_link.traces),
	.list = LIST_HEAD_INIT(group_link.list),
};
trace_t trace_dev_gro_receive = {
   
   
	.desc = "",
	.type = TRACE_FUNCTION,
	.analyzer = &ANALYZER(default),
	.is_backup = false,
	.probe = false,
	.name = "dev_gro_receive",
	.skb = 2,
	.custom = false,
	.def = true,
	.index = INDEX_dev_gro_receive,
	.prog = "__trace_dev_gro_receive",
	.parent = &group_link_in,
	.rules = LIST_HEAD_INIT(trace_dev_gro_receive.rules),
};
trace_list_t trace_dev_gro_receive_list = {
   
   
	.trace = &trace_dev_gro_receive,
	.list = LIST_HEAD_INIT(trace_dev_gro_receive_list.list)
};
rule_t rule_trace_dev_gro_receive_0 = {
   
   	.level 
关于 `NULL` 的概念以及其在编程中的应用已经在引用材料中有所提及。然而,当前问题涉及的是如何使用 `pktmon` 将 ETL 文件转换为 Wireshark 支持的 pcapng 格式并结合工具进行数据分析。以下是详细的解答: ### 使用 PktMon 转换 ETL 到 PCAPNG PktMon 是 Windows 提供的一个网络数据捕获工具,能够记录网络流量到 `.etl` 文件中。要将其转换为 Wireshark 可读的 `.pcapng` 格式,可以按照以下方法操作。 #### 安装和配置 PktMon 确保已安装最新版本的 PktMon 工具,并启用所需的权限来捕获网络流量。运行命令如下: ```bash pktmon start --nettrace --file c:\path\to\output.etl ``` 此命令会启动网络跟踪并将结果保存至指定路径下的 `.etl` 文件[^3]。 #### 转换 ETL 至 PCAPNG 完成数据收集后停止追踪: ```bash pktmon stop ``` 随后利用 Microsoft 提供的脚本或第三方工具将 `.etl` 文件转码成 `.pcapng` 格式。例如通过 PowerShell 执行官方提供的转化脚本: ```powershell ConvertTo-Pcap.ps1 -InputFile "c:\path\to\output.etl" -OutputFile "c:\path\to\output.pcapng" ``` 上述脚本需单独下载并与环境匹配才能正常工作[^4]。 #### 数据包分析与过滤器设置 打开生成好的 `.pcapng` 文件于 Wireshark 中加载显示全部抓取的数据帧。为了更高效地定位特定类型的通信行为或者异常状况,在顶部输入框设定相应的过滤条件表达式即可实现初步筛选功能。比如仅查看 HTTP 请求可键入字符串 `http.request.method == "GET"` 来限定范围[^5]。 ### 结合实例说明 NULL 处理逻辑的重要性 当处理数据库查询返回的结果集时经常会遇到某些列值可能为空的情况(即 SQL 层面表示为 NULL)。正如前面提到的例子那样,如果程序设计不当可能会引发潜在错误甚至崩溃风险。因此建议始终遵循良好实践原则——先验证再访问任何可能存在未赋初值的对象成员变量之前加以判断是否有效非空状态后再继续后续动作链路执行流程[^2]。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值