import os
import sys
import copy
#自动安装第三方模块
try:
import pandas as pd
except:
import os
os.system('pip install pandas') # 安装pandas模块,用于生成excel表格
import pandas as pd
try:
import openyxl
except:
os.system('pip install openpyxl') # 安装pandas依赖模块openpyxl
import openpyxl
IS_DEBUG = True
class PageOwnerParser(object):
def __init__(self, pageowner_file, ps_file, func):
self.pageowner_file = pageowner_file
self.ps_file = ps_file
self.func = func
self.path = os.getcwd()
def parsePageOwner(self):
with open(self.pageowner_file, "r") as f:
out_filter = []
out_filters = []
out_total = 0
out_filter_fusion_list = []
out_filter_fusion_dict = {}
segments = []
segment = []
# 1.分段分割
for line in f.readlines():
if (line == '\n'):
if(len(segment) != 0):
copy_segment = copy.copy(segment)
segments.append(copy_segment)
segment.clear()
else:
segment.append(line.strip())
#print("segments is ", segments)
# 2.遍历数组,搜集”关键字函数“中所在调用栈中的pid,times,page order。
# 以及统计所有调用栈的2^order * times累计总和(及page_owner中记录的所有page的大小总和)
for tmp_segment in segments:
# 2.1 解析当前调用栈分配次数
tmp_datas_line1 = tmp_segment[0].split()
times = tmp_datas_line1[0]
# 2.2 解析当前调用栈pid
tmp_datas_line2 = tmp_segment[1].split()
tmp_datas_line2_len = len(tmp_datas_line2)
pid = tmp_datas_line2[tmp_datas_line2_len-1]
# 2.3 解析当前调用栈的阶
tmp_data_line2_order = tmp_segment[1].split(",")
tmp_data_line2_order_split = tmp_data_line2_order[0].split()
tmp_data_line2_order_split_len = len(tmp_data_line2_order_split)
order = tmp_data_line2_order_split[tmp_data_line2_order_split_len-1]
match_func = False
for tmp_line in tmp_segment:
if(self.func in tmp_line):
match_func = True
# 2.4 提取“关键字函数”相关段中的pid,order,times
if(match_func):
out_filter.append(pid)
out_filter.append(2**int(order) * int(times) * 4)
out_filters.append(copy.copy(out_filter))
out_filter.clear()
out_total = out_total + 2**int(order) * int(times) * 4
# 此时out_filters生成的数据格式如下:
# [SPID Sizes(Kb)]
# [2327 128]
# [2327 2048]
# 如上名为2327的线程有两条,也就是说有可能会会出现相同进程确因为内存分配调用栈不同而导致数据分散,或者因为Order不同而导致数据分散;
# 因此下面需要对数据进行整合
#print(out_filters)
print("stack_number is ", len(segments))
print("out_total is ", out_total)
# 3.数据融合,融合后数据格式如下:
# {SPID:Sizes(Kb)}
# {2327:128}
for original_tmp in out_filters:
if original_tmp[0] in out_filter_fusion_dict:
out_filter_fusion_dict[original_tmp[0]] = int(out_filter_fusion_dict[original_tmp[0]]) + int(original_tmp[1])
else:
out_filter_fusion_dict[original_tmp[0]] = int(original_tmp[1])
#print(out_filter_fusion_dict)
return out_filter_fusion_dict
'''
# 4.数据转换,从dict转换为list,为了方便写入到excel表格当中
for fusion_dict_tmp in out_filter_fusion_dict:
fusion_list_tmp = []
fusion_list_tmp.append(fusion_dict_tmp)
fusion_list_tmp.append(out_filter_fusion_dict[fusion_dict_tmp])
out_filter_fusion_list.append(copy.copy(fusion_list_tmp))
#print(out_filter_fusion_list)
return out_filter_fusion_list
'''
def parsePS(self):
with open(self.ps_file, "r") as f:
ps_lines = []
spid_dic = {}
pid_dic = {}
pid_cmdline_dic = {}
# 1.按行解析
for line in f.readlines():
ps_lines.append(line)
print(">>>>>> ps's lines is ", len(ps_lines))
# 删除前两行,如下:
# Thu Jan 1 08:45:08 CST 1970
# USER PID SPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ps_lines.remove(ps_lines[0])
ps_lines.remove(ps_lines[0])
# 2. 解析USER PID SPID CMDLINE,并以{SPID1:[USER1, PID1, CMDLINE1],...,SPIDx:[USERx, PIDx, CMDLINEx]]
for line_new in ps_lines:
elements_ps = line_new.split()
spid = elements_ps[2]
pid = elements_ps[1]
cmdlie = elements_ps[11]
#2.1 解析pid,以及对应的cmdline,格式形如{pid:cmdline}
if pid not in pid_cmdline_dic:
pid_cmdline_dic[pid] = elements_ps[11]
#2.2 解析pid,以及对应的spid,格式形如{pid:[spid1,spid2,spid3]}
if pid in pid_dic:
pid_dic[pid].append(elements_ps[2])
else:
pid_info = []
pid_info.append(elements_ps[2])
pid_dic[pid] = copy.copy(pid_info)
#2.3 解析spid对应的pid,user,command,,格式形如{spid:[user,pid,command]}
if spid in spid_dic:
spid_dic[spid].append(elements_ps[0])
spid_dic[spid].append(elements_ps[1])
spid_dic[spid].append(elements_ps[11])
else:
spid_info = []
spid_info.append(elements_ps[0])
spid_info.append(elements_ps[1])
spid_info.append(elements_ps[11])
spid_dic[spid] = copy.copy(spid_info)
print(">>>>>> spid_dic's number is ", len(spid_dic))
#print(spid_dic)
print(">>>>>> pid_dic's lines is ", len(pid_dic))
#print(pid_dic)
return spid_dic, pid_dic, pid_cmdline_dic
def calculatePIDMemSize(self, spid_size_dic, spid_dic, pid_dic, pid_cmdline_dic):
pid_statistic = []
pid_statistic_list = []
pid_size_dic = {}
# 未知进程用“unknown”表示
unknown = 0
# 1.遍历spid_size_dic获取spid, 以及spid的size
for spid in spid_size_dic:
spid_size = spid_size_dic[spid]
# spid_dic内容为:{spid:[user,pid,command]}
# pid_dic内容为:{pid:[spid1,spid2,spid3]}
if spid in spid_dic:
# 2.得到spid_dic中对应spid的pid
pid_spid = spid_dic[spid][1]
if pid_spid in pid_size_dic:
pid_size_dic[pid_spid] = pid_size_dic[pid_spid] + spid_size
else:
pid_size_dic[pid_spid] = spid_size
else:
unknown = unknown + spid_size
pid_size_dic['unknown'] = unknown
# 3.生成最终数据,数据格式�
没有合适的资源?快使用搜索试试~ 我知道了~
pageowner 解析工具
共4个文件
py:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 7 下载量 100 浏览量
2022-05-13
18:37:12
上传
评论 2
收藏 11KB ZIP 举报
温馨提示
该工具组合可以对pageowner进行不同维度的解析,包括下面3各方面: 1.通过关键函数对pageowner进行解析、统计,最终以进程级展示进程的cma内存使用情况,并通过占用size自动排序。 2.该工具可用于分拆pageowner信息,并以进程和线程进行分别拆分,用于更细力度的pageowner拆分。 3.该工具用于解析整个pageowner中各个进程的内存使用情况 解析工具的开发是为了在我们拆分内存布局的时候能够提高效率,不容易出错,达到事半功倍的效果。 在使用过程中,遇到任何问题,都可以免费提供支持。
资源推荐
资源详情
资源评论
收起资源包目录
pageowner parse tools.zip (4个子文件)
01_SplitPageOwnerByPid-SPid.py 10KB
03_ParsePageOwnerALL.py 11KB
04_SplitPageOwnerByFunc.py 4KB
02_ParsePageOwnerByFunc.py 11KB
共 4 条
- 1
高桐@BILL
- 粉丝: 3074
- 资源: 43
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页