简单的监控软件

本文介绍了一种方法,在Windows系统中,当出现CRASH现象时,自动存取dump文件并写入日志,同时不影响程序的继续执行。方法包括下载并使用pywin32和WMI模块,监控指定进程(如windbg.exe),在出现CRASH时自动存取dump文件,并将相关信息记录到日志文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了实现监控出现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) 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值