| 139 | } |
| 140 | |
| 141 | func (this *MapsHelper) UpdateForkEvent(event *ForkEvent) { |
| 142 | // 根据日志实际的记录结果 fork 的 pid ppid 存在相同的情况 why |
| 143 | parent_pid, ok := this.child_parent_map[event.Pid] |
| 144 | if !ok { |
| 145 | this.child_parent_map[event.Pid] = event.Ppid |
| 146 | // 为了便于后续能够快速查找进程的maps |
| 147 | // 出现fork事件的时候 把父进程已经收集到的 maps 信息也复制一份 |
| 148 | // 最开始想设计为需要计算的时候 查找父进程 再去解析偏移 但是考虑到fork产生的子进程可能会产生新的操作 这样不合理 |
| 149 | if event.Pid != event.Ppid { |
| 150 | this.CloneMaps(event.Pid, event.Ppid) |
| 151 | } |
| 152 | } else { |
| 153 | // 大多数情况下应该是不会到这个分支的 除非是进程id不够用了 |
| 154 | // 例如 A 产生 B B 产生 C A结束 C 产生 D 那么这个时候 D 被分配的pid可能是之前A的pid(应该是有这个概率的 |
| 155 | if parent_pid != event.Ppid { |
| 156 | // 本次所产生的子进程的父进程 与原本记录的父进程不一致 |
| 157 | // 那么更新此次的子进程的父进程 |
| 158 | this.child_parent_map[event.Pid] = event.Ppid |
| 159 | } |
| 160 | } |
| 161 | } |
| 162 | |
| 163 | func (this *MapsHelper) CloneMaps(pid, parent_pid uint32) (err error) { |
| 164 | // 为子进程复制一份maps信息 |