为了实现监控出现CRASH现象,出现windbg的时候自动存取dump文件,并写入Log,不影响case的继续执行
1.win32模块的下载地址:http://sourceforge.net/projects/pywin32/files/pywin32/
用.exe文件安装后,进入目录运行模块的脚本才可使用。
2.WMI模块的下载地址:
http://timgolden.me.uk/python/downloads/WMI-1.4.6.win32.exe
3.代码如下
import logging
import wmi
import os
import time
import shutil
import re
import win32gui,win32ui,win32con
from ConfigParser import ConfigParser
#CONFIGFILE = 'config.ini'
#config = ConfigParser()
#config.read(CONFIGFILE)
#ProgramPath = config.get('MonitorProgramPath','ProgramPath')
ProcessName = 'windbg.exe'
#读取配置文件中的进程名和系统路径,这2个参数都可以在配置文件中修改
ProList = []
PidList=[]
#定义一个进程列表
c = wmi.WMI()
def Monitor_WDB():
global i
jpid=0
print i
#设置了最大存储Dump文件的数量
if i<=10:
for process in c.Win32_Process():
ProList.append(str(process.Name))
if ProcessName==str(process.Name):
PidList.append(str(process.ProcessId))
jpid=jpid+1
for process in ProList:
#ProList.append(str(process.Name))
#把所有任务管理器中的进程名添加到列表
if ProcessName==process:
#打印出现了crash
jpid=jpid-1
i=i+1
print "a crash happened..."
#log存取路径
nowpath=os.getcwd()
save_dump();
#kill掉windbg.exe 通过PID
proc_id=PidList[jpid]
print proc_id
os.system('taskkill /F /PID %s' %proc_id)
#save log
os.chdir(nowpath)
f=open("log"+time.strftime("%Y%m%d", time.localtime())+'.log','a')
print 'a crash happened.....'
#写入时间和crash记录到日志文件中
f.write(str(i)+' crash happened.....'+'\n')
f.write(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) +'\n')
#os.startfile(ProgramPath)
f.close()
print 'Save Log Success...'
print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
continue
#如果进程名不在列表中
print "no crash"
del ProList[:]
del PidList[:]
#清空列表,否则列表会不停的添加进程名,会占用系统资源
else:
#crash 过多停止存储
print 'too many crash'
def save_dump():
mainform = None
try:
mainform = win32gui.FindWindow("WinBaseClass",None)
print mainform
#hWnd.ShowWindow(win32con.SW_NORMAL)
except win32ui.error,e:
print u'没有找到相应窗口的提示' ,e
astr=""
aStr= raw_input()
exit()
#找到输入命令的行
t1=win32gui.GetDlgItem(mainform,0x0FA3)
#panel1 = win32ui.FindWindowEx(mainform,None,None,'')
print t1
#combobox1 = win32ui.FindWindowEx(panel1,None,'StandardWindow',None)
#print combobox1
#combobox = win32ui.FindWindowEx(combobox1,None,'EditComponent',None)
#panel1.SendMessage(win32con.WM_SETTEXT,'aadf')
win32gui.SendMessage(t1,win32con.WM_SETTEXT,None,r".dump /mf C:\temp\\"+time.strftime('%Y%m%d-%H时%M分%S秒', time.localtime())+'.dmp')
win32gui.PostMessage(t1, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32gui.PostMessage(t1, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
#log路径,存log
logpath=r'C:\\Program Files\\Trend Micro\\AMSP\\debug\\10011\\tmsa.log'
if(os.path.exists(logpath)):
shutil.copy(logpath,r'C:\\temp\\')
os.chdir(r'C:\\temp\\')
os.rename('tmsa.log','tmsa'+time.strftime('%Y%m%d-%H时%M分%S秒', time.localtime())+'.log')
time.sleep(10)
# stat = os.system("taskkill /f /im windbg.exe")
if __name__=="__main__" :
global i
i=0
stat = os.system("taskkill /f /im windbg.exe")
f=open("log"+time.strftime("%Y%m%d", time.localtime())+'.log','w')
f.write(str(i)+' crash happened.....'+'\n')
f.write(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) +'\n')
f.close()
while True:
Monitor_WDB()
time.sleep(10)