perf采样eBPF函数时bpf_ktime_get_ns返回负值的问题求助
问题原因与解决方法
核心原因
你遇到的负数值问题是类型不匹配导致的:
- eBPF代码中
bpf_ktime_get_ns()返回的是u64(无符号64位整数)类型的系统启动以来纳秒数,当系统运行时间较长时,这个值会超过int64(有符号64位整数)的最大值9223372036854775807。 - Go代码中定义的
bpfSchedEventT结构体里,Ntime字段大概率被声明为int64(有符号类型),用binary.Read读取无符号的u64数据时,会将高位解析为符号位,最终得到负数。
解决方案
修改Go代码中的bpfSchedEventT结构体,将Ntime字段的类型从int64改为uint64:
type bpfSchedEventT struct { Pid uint32 // 对应eBPF中的u32 pid Ntime uint64 // 替换原int64类型 }
修改后重新读取输出,就能得到正确的正数值。
验证说明
以输出中的-4952501534609899520为例,将其转换为uint64后得到13494242539099652096,换算成天数约为156天,符合长期运行系统的时间范围,说明原始时间值本身是正确的,仅因类型解析错误导致显示为负数。
内容的提问来源于stack exchange,提问作者user23980149
相关产品推荐
相关产品推荐

