程序运行监控、崩溃重新启动(高手请进)

ky310 2009-04-02 03:07:28
大致情况:开发的一软件运行久了会出现崩溃的情况,时间紧暂时未找出具体问题,因为该软件必须长期运行,于是开了一个监控软件,发现其崩溃即将结束该进程然后重新启动。

问题是:监控软件在发现其崩溃后无法结束其进程。试过多种方法,TeminateProcess等,不行!请求高手指点,希望做到,发现崩溃后干净的清除该进程然后重新启动,当然重启一定次数后直接重新启动计算机(这部分本人可以完成)。

大侠请不吝赐教!分不多,是个意思!

...全文
843 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ky310 2009-04-14
  • 打赏
  • 举报
回复
KeSummer : 基于WM_TIMER消息机制的心跳包可以发送的话,是不是窗口消息也可以正常发送呢?我的工程为SDI,SPLITTER分窗口显示。如果引起崩溃的问题发生在其中一个窗口的话,其他窗口的消息机制照样不受影响?
ky310 2009-04-14
  • 打赏
  • 举报
回复
感谢各位支持,该问题最终解决情况如下:

1、程序本身的BEG我找到了,主要原因是有GDI未释放,现改为成员变量;

2、监控程序问题像大家致歉,是我自身的测试问题,本来是用Teminate加权限已经可以正常结束进程,但我判断程序异常有问题...

3、KeSummer : 你的程序中起个线程,每隔3秒或者一段时间发窗口消息给 监视进程,如果监视进程隔一段时间仍未收到消息则重启。 == 感谢指点!之前我采用
的是建立TIMER定时通过SOCKET发送心跳到监控程序,但程序崩溃后如用户未点击退出WINDOWS错误对话框,心跳包照样可以发出。
Mi_Bo 2009-04-09
  • 打赏
  • 举报
回复
用windows的异常处理机制可以实现程序崩溃以后自动重启程序,不用额外的进程监控的.比如qq就是这样做的
ylywyn136 2009-04-07
  • 打赏
  • 举报
回复
..可能有内存泄漏
KeSummer 2009-04-07
  • 打赏
  • 举报
回复
当程序无法结束的时候,应该看看那些线程处于挂起状态,并查看堆栈来解决问题。

如果真的要重启来解决问题,可以参考看门狗。

你的程序中起个线程,每隔3秒或者一段时间发窗口消息给 监视进程,如果监视进程隔一段时间仍未收到消息则重启。
KeSummer 2009-04-07
  • 打赏
  • 举报
回复
TeminateProcess结束不了大致也就下面的原因。

1:等待驱动创建的内核事件,某些API或者第三方库会有这个进行此类操作。

2:访问文件驱动内部错误,例如访问一个KEY已丢失的NTFS加密文件或者访问已经划伤的光盘。

3:等等。。

我在开发过程中就遇到上面两种。TeminateProcess确实是无法结束的。
lwd4210 2009-04-06
  • 打赏
  • 举报
回复
确实,我也遇到过,最好治本,先顶一个
xuxingok 2009-04-06
  • 打赏
  • 举报
回复
up
「已注销」 2009-04-06
  • 打赏
  • 举报
回复
或许可以这样试一下: 用 try{} catch (...){} 这样崩溃并弹出对话框的可能性就较小,在 catch 下面自己退出.监控程序检测到这个进程没有了就赶紧启动. 不过好像 try-catch 会影响速度.
NineheadedBird 2009-04-03
  • 打赏
  • 举报
回复
dump下 看具体崩溃在什么地方。
NineheadedBird 2009-04-03
  • 打赏
  • 举报
回复
顶7楼,我就不信 有权限了 TeminateProcess 还无效。
难道是系统资源耗尽,TeminateProcess 也没办法调用了...
saiyaman5 2009-04-03
  • 打赏
  • 举报
回复
治本...
  • 打赏
  • 举报
回复
最好还是找出软件本身崩溃的原因 你那样是治标不治本
bk_wxb 2009-04-02
  • 打赏
  • 举报
回复
如果TeminateProcess()都不能结束该进程的情况,是因为监控进程对被结束进程(进程号pid)的访问权限不足. 使具有PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_TERMINATE权限就能结束进程pid.仅供参考
......

HANDLE hpWriteDAC = OpenProcess( WRITE_DAC, FALSE, pid );
if( !hpWriteDAC )
{
HANDLE htok;
OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &htok )
TOKEN_PRIVILEGES tpOld;
EnableTokenPrivilege( htok, SE_TAKE_OWNERSHIP_NAME, tpOld ); // tpOld便于恢复
HANDLE hpWriteOwner = OpenProcess( WRITE_OWNER, FALSE, pid )
if ( GetTokenInformation( htok, TokenUser, buf, cb, &cb ) )
{
DWORD err = SetSecurityInfo(hpWriteOwner,SE_KERNEL_OBJECT,OWNER_SECURITY_INFORMATION,
reinterpret_cast<TOKEN_USER*>(buf)->User.Sid,0, 0, 0);
DuplicateHandle( GetCurrentProcess(), hpWriteOwner,GetCurrentProcess(), &hpWriteDAC, WRITE_DAC, FALSE, 0 ) )
AdjustDacl( hpWriteDAC, accessRights );
DuplicateHandle( GetCurrentProcess(), hpWriteDAC,GetCurrentProcess(), &hProcess,accessRights, false, 0);
}
RestoreTokenPrivilege( htok, tpOld );
}
cnzdgs 2009-04-02
  • 打赏
  • 举报
回复
崩溃具体是什么现象?最好在程序内部捕获异常,然后重新加载实例并主动退出。如果用另外的程序监控,可以参考MSDN中的Debugging Functions。
Fireway2008 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pzhfei 的回复:]
这种问题通常都是软件本身存在内存泄露或gdi资源泄露的问题!!
[/Quote]

你的软件有没有和数据库绑带?
也有可能是数据库某些字段越界,导致程序崩溃.可以考虑把字段容量扩大.
缘来是梦 2009-04-02
  • 打赏
  • 举报
回复
这种问题通常都是软件本身存在内存泄露或gdi资源泄露的问题!!
ky310 2009-04-02
  • 打赏
  • 举报
回复
哥们帮忙看看啊!怎么那么少人回复?
lllsui 2009-04-02
  • 打赏
  • 举报
回复
不会哦
ky310 2009-04-02
  • 打赏
  • 举报
回复
没人顶?自己顶上!

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧