又是超难的问题,参与都有分!不是忽悠人的!(100分)

  • 主题发起人 主题发起人 cqwty
  • 开始时间 开始时间
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
有个服务器软件,需要24小时运行,但是总是会因为出一些莫明其妙的系统错误之后就停止了.因为是公司以前的员工开发的,当然找到错误发生的原因,修改升级是最好的办法,但是这需要时间,而且可能找不到.所以在没有找到错误发生原因之前,先保证这个软件的正常运行,想写一个监视程序,专门监视这个软件,当错误对话框弹出来的时候,记录下这个错误,然后点击确定,重新启动软件.各位大侠,如果你们做过相关的处理的,共享一下你们的办法,着急,关系到饭碗.谢谢!
 
在它的程序上放一个 TApplicationEvent 控件,可以得到他没有获取的异常.

不要用 ShowMessage 的方式来显示异常,因为如果没有按的话,程序就挂在那里了.
 
写一个软件狗监测它,不过这种情况可能软件狗也会死,最好再做个硬件狗,他们都死了就重起.
 
我也想知道怎么处理。
 
软件狗的方法很简单.在原来程序中加一个message消息触发,定时给你的软件狗程序发送消息.软件狗判断超时没有接受到被监测程序发送过来的Message说明原来程序有问题,那就可以做相应的事情了
 
写一个软件狗监测它,不过这种情况可能软件狗也会死,最好再做个硬件狗,他们都死了就重起.

-----------------
最好就用个人来守在那里.死了就重启.
 
看了你的几个帖子,都是跟监控有关,你不是想要做测试软件或者破解软件吧
 
软件狗一般不会有问题,我说他死是指服务器死机,假如服务器不会死机,软件狗就不会有问题的.
----------------------------------------------------------------
找个人受在哪不错,省得写程序...哈哈,QSmile真有意思.
 
谢谢大家的回答,我的问题是和监控有关,但是不是破解,我自己还没有这个水平,说实在的.我看了大家的的说法,修改原来的代码,然后定时给我的监控程序发消息,如果时间到了没有收到消息,那就说明死了,然后结束了重新启动;
而我的要求是在不修改原始代码的前提下来做这件事.大家继续发表看法和思路,如果问题解决了,我会把解决方法说出来,核心代码也会公布出来的.
 
我在想一个问题,当错误或者告警消息对话框弹出来的时候,是以模态方式显示的,那么这个时候就会导致当前的窗体(我们公司的这个服务器软件有窗体的,但是如果最小化的时候,估计不行了.)是不是激活的状态值就发生了变化了呢?是不是有激活状态变成了非激活状态,同时控制焦点也不在了.那么根据windows提供的13种类型的钩子里面,有个钩子WH_CBT可以对这种变化所产生的系统消息进行拦截.WH_CBT钩子详细介绍如下:
2、WH_CBT Hook
在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:
1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
2. 完成系统指令;
3. 来自系统消息队列中的移动鼠标,键盘事件;
4. 设置输入焦点事件;
5. 同步系统消息队列事件。
Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。
 
如果我上面说的方法可行,那么就差判断是不是我的软件产生的消息了.这个我是这么想的,采用postmessage给这个软件的窗口发送WM_ACTIVATE = $0006,关于WM_ACTIVATE = $0006解释为:一个窗口被激活或失去激活状态;而这里不采用sendmessage发送的原因在于,postmessage如果执行成功,那么返回的是一个非零值,如果执行失败,那么返回的是一个0值.那么我就根据这个返回值来判断是不是我的软件产生的.如果是那就可以判断软件出了问题,如果不是,那就可以判断不是我的软件出问题,不用理睬.这个解决思路看起来似乎合理,也可行.先测试一下看看.各位大侠继续发表看法,谢谢!
 
要判断你的程序是否仍然在正常运行实在是有些困难
即便是不响应消息也不能证明它就死掉了
即便是它响应消息也不能证明它就正常运行
这还是要看这程序究竟是干什么的
 
楼上的大哥说的是,但是如果一个程序的窗体都不能相应WM_ACTIVATE = $0006这个消息了,那你觉得这个程序还在正常运行嘛?我对windows了解不多,麻烦解释一下,你提的这个问题是个好问题,非常谢谢你!
 
实践证明当错误对话框或者告警对话框弹出的时候,确实可以拦截到这个消息.但是一个前提就是,必须保证窗体不是最小化在任务栏的,如果在任务栏的,那没有办法拦截的.
 
万一守在那儿的那个人死了……
 
好笑,看来的搞个备份的人,不过搞备份的人也不行啊,万一哪儿发生地震什么的,那不是两个一起死,看来得搞个异地容灾中心,好像可以解决了哈,不过万一彗星撞地球,地球也给毁灭了,那就在火星上搞个异地容灾,好办法啊,这下完了.宇宙都完了,还要系统干什么,死就死了,哈哈!
 
LZ看看SEH怎么调试程序吧。
 
我觉得可以这样处理:
1.新建一个程序A,用来监视原来的程序。
2.在原来的程序B里加一段代码,定时向A发送消息,比如定时按某按钮C,可以用postmessage函数。
3.新程序A用一个定时器定时检测按钮C是否被按下,如果未被按下则证明程序B出了问题,
立即向程序B发送消息按下“确定”按钮。 (此时要考虑到程序B是否死掉的现象)
 
忘了楼主是不想改原来的代码的,其实有个最笨的办法,就是新建一个程序每隔一段时间按一下原来程序的“确定”键,根本就不用那么复杂

这也算是大智若鱼吧,哈哈
 
假设原程序是A,你的程序是B
为什么不用HOOK,钩住程序A,也就是说,先运行程序B,用程序B去运行程序A,监视程序A的运行状态,如果程序A退出了,也就可以重新运行程序A
 
后退
顶部