|
|
@@ -336,8 +336,12 @@ func buildLevelFromEvent(sdl *RootDataT) {
|
|
|
}
|
|
|
mapSlice = append(mapSlice, timeEndMap)
|
|
|
}
|
|
|
- sort.Slice(mapSlice, func(i, j int) bool {
|
|
|
- return mapSlice[i].Time < mapSlice[j].Time
|
|
|
+ sort.SliceStable(mapSlice, func(i, j int) bool {
|
|
|
+ if mapSlice[i].Time != mapSlice[j].Time {
|
|
|
+ return mapSlice[i].Time < mapSlice[j].Time
|
|
|
+ }
|
|
|
+ // 同一时刻,入口事件(Type=0)优先于出口事件(Type=1),避免空栈弹出
|
|
|
+ return mapSlice[i].Type < mapSlice[j].Type
|
|
|
})
|
|
|
|
|
|
funStack := []TimeMap{}
|
|
|
@@ -359,12 +363,16 @@ func buildLevelFromEvent(sdl *RootDataT) {
|
|
|
Nid += 1
|
|
|
} else if v.Type == 1 {
|
|
|
// 函数出口
|
|
|
- len := len(funStack)
|
|
|
- funStack = funStack[:len-1]
|
|
|
- if (len - 2) < 0 {
|
|
|
+ l := len(funStack)
|
|
|
+ if l == 0 {
|
|
|
+ // 出口事件无匹配的入口事件(eBPF采样丢失/数据截断),安全跳过
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ funStack = funStack[:l-1]
|
|
|
+ if (l - 2) < 0 {
|
|
|
currentNid = 1
|
|
|
} else {
|
|
|
- currentNid = funStack[len-2].Map.Nid
|
|
|
+ currentNid = funStack[l-2].Map.Nid
|
|
|
}
|
|
|
|
|
|
level -= 1
|