专利名称:一种基于窗口平台的应用程序监控方法
技术领域:
本发明涉及应用程序监控技术,具体涉及一种基于窗口平台的应用程序监 控方法。
背景技术:
在电信网络中,除了用于完成用户接入和呼叫流程处理的嵌入式系统外, 网管服务、计费服务、统计服务、智能呼叫等服务功能也是在后台服务器上实现的,而由于窗口 ( Windows)平台具有通用性、易操作性等特点,所以,现 有电信网络中很多后台服务器都是基于Windows平台的。为了使一个后台服务器可以提供多种服务功能,通常的做法是将每种服务 功能做成一个独立的应用程序,例如完成计费功能的计费服务器程序、完成统 计功能的统计服务器程序等。多个独立的程序在同一个后台服务器上运行时, 如果出现某个或某些程序异常或长时间不响应的情况,就需要及时重启所述程 序甚至重启服务器,否则将会导致业务错误,甚至业务中断。因此,必须采用 有效的监控方法,实时监控这些运行在同 一个后台服务器上的多个应用程序的 运行状况,以1更在应用程序异常或长时间不响应的情况下,及时重启程序或服 务器以保证业务正常。Windows操作系统本身提供了 一些针对Windows平台上应用程序的监控方 法,例如,将应用程序做成服务程序,在服务配置时,通过服务控制器设置在 服务失败时重启服务程序或重启服务器。但是,由于服务控制器无法对服务程 序长时间不响应的情况及时作出判断,不能4艮好地满足在重启一个程序的同时, 重启其他几个相关程序的要求,所以,这种方法实时性差,且容易引起后台服 务器功能错误。还有一种应用程序监控方法,通过编写监控程序,由监控程序对相关应用 程序的运行状态进行监控。监控程序对应用程序的监控是通过定时与被监控程 序握手实现的,如果监控程序检测到某个被监控应用程序的握手信号在一段时 间内丢失,则认为该应用程序长时间未响应或者出现异常,从而可以重启应用 程序或服务器以保证业务正常。握手的方法一般采用发送消息或写共享内存的 方式,但这两种方式均需要在被监控应用程序中增加相应的代码,以响应握手 消息或写共享内存。所以,这种方法占用系统资源,且可扩展性差。发明内容有鉴于此,本发明的主要目的在于提供一种基于窗口平台的应用程序监控 方法,能够实现准确的实时监控、并且可扩张性好。为达到上述目的,本发明的技术方案是这样实现的 一种基于窗口平台的应用程序监控方法,该方法包括a、 监控程序启动后,根据配置文件中被监控应用程序的配置信息分别创建 被监控应用程序进程;b、 所述^l监控应用程序进程创建成功后,监控程序将注入动态链接库DLL 的代码注入所述创建成功的进程;c、 注入DLL修改所述创建成功进程中的消息分发函数代码;d、 监控程序定时向所有的被监控应用程序发送握手消息,被监控应用程序 收到消息后,调用步骤c所述修改后的消息分发函数,所述修改后的消息分发 函数确定收到消息为监控程序发送的握手消息时,向监控程序返回应答消息。所述配置文件中的应用程序配置信息至少包括应用程序的路径、应用程 序最大应答超时次数和发送握手消息频率。步骤b所述将注入DLL的代码注入进程为在进程中创建一个入口函数为 DLL加载函数、参数为注入DLL名称的线程并执行。所述DLL修改系统消息分发函数代码包括cl、设置与消息分发函数参数类型和返回类型相同的函数指针x,为所设置的指针申请内存;c2、设置函数y,所设置函数的参数类型和返回类型与消息分发函数相同;c3、将消息分发函数代码的前五个字节拷贝到指针x所指向内存的前五个 字节,并修改消息分发函数代码的第一个字节为跳转JMP指令,后四个字节为 跳转到函数y的字节数;c4、将指针x所指向内存的第六个字节修改为JMP指令,其后四个字节为 跳转到消息分发函数第六个字节的字节数。步骤c2所述函数y,用于判断被监控应用程序进程收到的消息是否为监控 程序发送的握手消息,如果是,则向监控程序返回应答信息后调用指针x;否 则直接调用指针x。设置应答时间阈值,如果监控程序发出握手消息后在应答时间阈值内未收 到应答消息,则应答超时;当所述被监控应用程序应答超时次数大于应用程序 最大应答超时次数时,监控程序重启所述被监控应用程序进程及其相关应用程 序进程。所述重启被监控应用程序之前,该方法进一步包括监控程序结束所述被 监控应用程序进程。设置超时次数阈值,该方法进一步包括所有被监控应用程序重启次数超 过设定的超时次数阈值时,重启服务器。本发明基于窗口平台的应用程序监控方法,采用动态链接库(DLL)注入 的方式修改应用程序加载的消息分发函数代码,使消息分发函数能够截获并应 答监控程序的握手消息,无需在应用程序中增加代码配合监控,可扩展性好, 并且可以实现准确的实时监控。
图1为本发明基于窗口平台的应用程序监控系统结构图; 图2为本发明基于窗口平台的应用程序监控方法流程图; 图3为将DLL代码注入进程的流程图;图4为本发明注入DLL修改消息分发函数代码流程图。
具体实施方式
本发明的基本思想是采用动态链接库(DLL)注入的方式修 文应用程序 加载的消息分发函数代码,使消息分发函数能够截获并应答监控程序的握手消 息。下面结合具体实施例及附图对本发明作进一步详细说明。图1为本发明基于窗口平台的应用程序监控系统结构图,如图1所示,本 发明基于窗口平台的应用程序监控系统包括监控程序、配置文件和应用程序。 其中,应用程序用于完成计费功能等多种业务功能;监控程序用于根据配置文 件配置并启动被监控应用程序,以及对被监控应用程序的运行状态进行实时监 控;配置文件用于保存应用程序的基本信息及监控进程使用的全局配置信息, 如应用程序路径、最大超时应答次数、发送握手消息的频率、最大进程重启次 数等。图2为本发明基于窗口平台的应用程序监控方法流程图,如图2所示,本 发明基于窗口平台的应用程序监控方法包括以下步骤步骤20~步骤21:监控程序启动后,从配置文件中读取被监控应用程序配 置信息,并分别创建被监控应用程序进程,即启动被监控应用程序。为了保证在系统重新启动后监控程序能够自动启动, 一般将监控程序添加 到系统启动项中,而配置文件中被监控应用程序配置信息, 一般包括应用程序 的if各径、应用程序最大应答超时次^:、应用程序的窗口类名和应用程序的窗口 名称等。其中,应用程序的路径可以配置绝对路径,也可以配置相对路径,当 配置的是相对路径时,监控程序在创建被监控应用程序进程时会自动加上当前 运行路径作为应用程序^各径,而对于应用程序的窗口类名和窗口名称,可以选 择不做配置。这里,配置文件的内容可以在监控程序提供的界面上配置,也可 以根据配置文件的格式直接在配置文件中修改。此外,监控程序创建被监控应用程序进程后,会保存进程标识(ID)、进程 句柄及进程接收握手消息的窗口句柄等信息,其中,进程ID主要用于被监控程序信息显示用;进程句柄用于对进程进行操作,例如强制关闭进程等;而进程 接收握手消息的窗口句柄可以通过两种方式荻取如果被监控应用程序配置信 息中已经指定了窗口类名和窗口名,则直接调用窗口查找函数获取;否则,遍 历系统所有的窗口 ,如果某窗口所在进程的进程ID与所述被监控应用程序进程 的进程ID相同,则确定该窗口为进程的握手消息接收窗口 。步骤22:被监控应用程序进程创建成功后,监控程序将注入DLL的代码 注入所述进程中。这里,将注入DLL的代码注入进程为在进程中创建一个入口函数为DLL 加载函数、参数为需要注入应用程序的DLL名称的线程并执行。所述注入应用 程序的DLL能够从系统DLL中查到消息分发函数的地址,并修改消息分发函 数代码,使其能够截获并应答监控程序发来的握手消息。图3为将DLL代码注入进程的流程图,如图3所示,将DLL代码注入进 程包括步骤221~步骤222:在进程的地址空间申请一块内存,其名称可以为 pDLLName,并将注入DLL的名称拷贝到所述内存。步骤223 步骤224:获取DLL加载函数的地址pLoadFunc,并调用远程线 程创建函数在进程空间创建一个入口函数为pLoadFunc,参数为注入DLL名称的线程。步骤225:线程执行完毕,关闭线程句柄。 步骤23:注入DLL修改消息分发函数代码。图4为本发明注入DLL修改消息分发函数代码流程图,如图4所示,本发 明注入DLL修改消息分发函数代码包括步骤231:设置与消息分发函数参数类型和返回类型相同的函数指针x,如 指针JmpFunc,申请一块内存,将设置的指针JmpFunc指向所申请的内存。步骤232:设置一个函数y,如函数MyDispacth,所设置函数的参数类型 和返回类型与消息分发函数相同。这里,所设置的函数能够判断应用程序进程收到的消息是否为握手消息,如杲是握手消息,则调用消息发送函数给监控程序回复应答消息后,调用指针JmpFunc;否则直接调用指针JmpFunc。步骤233 步骤234:获取系统消息分发函数的代码地址,并将消息分发函 数代码的前五个字节拷贝到指针JmpFunc所指向内存的前五个字节。步骤235:修改消息分发函数代码的第一个字节为跳转(JMP)指令,后四 个字节为跳转到函数MyDispatch的字节数,即当前地址到函数MyDispacth的 距离。步骤236:将指针JmpFunc所指向内存的第六个字节修改为JMP指令,其 后四个字节为跳转到消息分发函数第六个字节的字节数,即当前地址到消息分 发函数第六个字节的距离。步骤24:监控程序定时向所有的被监控应用程序发送握手消息。这里,监 控程序按照应用程序配置信息中设置的发送握手消息频率向应用程序发送握手 消息。步骤25 步骤29:应用程序进程每次收到消息后,调用步骤23所述修改后 的消息分发函数,修改后的消息分发函数判断收到的消息是否为监控程序发送 的握手消息,如果是,向监控程序返回应答消息后,执行正常的消息分发流程; 否则,直接执行正常的消息分发流程。本发明调用修改后消息分发函数时的指令执行顺序为应用程序每次收到 消息后,调用消息分发函数。消息分发函数第一条指令为跳转指令,根据跳转 地址跳转到函数MyDispath;函数MyDispatch判断收到的消息是否为握手消息, 如果是则调用消息发送函数向监控进程发送应答消息后调用指针JmpFunc;否 则,直接调用指针JmpFunc;指针JmpFunc所指向内存前五个字节的指令为消 息分发函数前五个字节指令,第六个字节为跳转指令,跳转到消息分发函数的 第六个字节,即执行完消息分发函数的前五个字节指令后,继续从消息分发函 数的第六个字节开始执行,完成正常的消息分发流程。如果监控程序发出握手消息后在设置的应答时间阈值内没有收到应答消 息,则认为应答超时,当所述应用程序应答超时次数大于该应用程序配置信息中的应用程序最大应答超时次数时,监控程序重启所述应用程序进程及其相关 应用程序进程。这里,监控程序在重启应用程序会先结束所述被监控应用程序进程,从而 避免出错进程未结束而导致新进程无法启动的情况。并且,所有被监控应用程序重启次数超过配置文件中设定的超时次数阈值 时,重启服务器以防止因某些资源限制,如数据库连接池已满,而导致应用程 序无法正常运行的情况。以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
权利要求
1、一种基于窗口平台的应用程序监控方法,其特征在于,该方法包括a、监控程序启动后,根据配置文件中被监控应用程序的配置信息分别创建被监控应用程序进程;b、所述被监控应用程序进程创建成功后,监控程序将注入动态链接库DLL的代码注入所述创建成功的进程;c、注入DLL修改所述创建成功进程中的消息分发函数代码;d、监控程序定时向所有的被监控应用程序发送握手消息,被监控应用程序收到消息后,调用步骤c所述修改后的消息分发函数,所述修改后的消息分发函数确定收到消息为监控程序发送的握手消息时,向监控程序返回应答消息。
2、 根据权利要求1所述的方法,其特征在于,所述配置文件中的应用程序 配置信息至少包括应用程序的路径、应用程序最大应答超时次数和发送握手 消息频率。
3、 根据权利要求1所述的方法,其特征在于,步骤b所述将注入DLL的 代码注入进程为在进程中创建一个入口函数为DLL加载函数、参数为注入 DLL名称的线程并执行。
4、 根据权利要求1所述的方法,其特征在于,所述DLL修改系统消息分 发函数代码包括cl、设置与消息分发函数参数类型和返回类型相同的函数指针x,为所设置 的指针申请内存;c2、设置函数y,所设置函数的参数类型和返回类型与消息分发函数相同; c3、将消息分发函数代码的前五个字节拷贝到指针x所指向内存的前五个字节,并修改消息分发函数代码的第一个字节为跳转JMP指令,后四个字节为跳转到函数y的字节数;c4、将指针x所指向内存的第六个字节修改为JMP指令,其后四个字节为跳转到消息分发函数第六个字节的字节数。
5、 根据权利要求4所述的方法,其特征在于,步骤c2所述函数y,用于 判断被监控应用程序进程收到的消息是否为监控程序发送的握手消息,如果是, 则向监控程序返回应答信息后调用指针x;否则直接调用指针x。
6、 根据权利要求2所述的方法,其特征在于,设置应答时间阈值,如果监 控程序发出握手消息后在应答时间阈值内未收到应答消息,则应答超时;当所 述被监控应用程序应答超时次数大于应用程序最大应答超时次数时,监控程序 重启所述被监控应用程序进程及其相关应用程序进程。
7、 根据权利要求6所述的方法,其特征在于,所述重启被监控应用程序之 前,该方法进一步包括监控程序结束所述被监控应用程序进程。
8、 根据权利要求6所述的方法,其特征在于,设置超时次数阈值,该方法 进一步包括所有被监控应用程序重启次数超过设定的超时次数阈值时,重启 服务器。
全文摘要
本发明公开一种基于窗口平台的应用程序监控方法,该方法包括监控程序启动后分别创建被监控应用程序进程;监控程序将注入动态链接库(DLL)的代码注入进程;注入DLL修改进程中消息分发函数代码;监控程序定时向所有的被监控应用程序发送握手消息,被监控应用程序收到消息后,调用修改后的消息分发函数,修改后的消息分发函数确定收到的消息为监控程序发送的握手消息后,向监控程序返回应答消息。本发明的监控方法采用DLL注入的方式修改系统消息分发函数代码,使系统消息分发函数能够截获并应答监控程序的握手消息,不用在应用程序中增加代码配合监控,可扩展性好,并且可以实现准确的实时监控。
文档编号H04Q3/00GK101227630SQ20081005707
公开日2008年7月23日 申请日期2008年1月29日 优先权日2008年1月29日
发明者刘少情 申请人:中兴通讯股份有限公司