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

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

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

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

...全文
530 点赞 收藏 20
写回复
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
回复 点赞
ttwtt 2009年04月06日
或许可以这样试一下: 用 try{} catch (...){} 这样崩溃并弹出对话框的可能性就较小,在 catch 下面自己退出.监控程序检测到这个进程没有了就赶紧启动. 不过好像 try-catch 会影响速度.
回复 点赞
NineheadedBird 2009年04月03日
dump下 看具体崩溃在什么地方。
回复 点赞
NineheadedBird 2009年04月03日
顶7楼,我就不信 有权限了 TeminateProcess 还无效。
难道是系统资源耗尽,TeminateProcess 也没办法调用了...
回复 点赞
saiyaman5 2009年04月03日
治本...
回复 点赞
写不动代码的人 2009年04月02日
最好还是找出软件本身崩溃的原因 你那样是治标不治本
回复 点赞
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日
没人顶?自己顶上!
回复 点赞
发动态
发帖子
进程/线程/DLL
创建于2007-09-28

6376

社区成员

4.9w+

社区内容

VC/MFC 进程/线程/DLL
社区公告
暂无公告