后台服务程序,service 方式
开启服务,没有任何问题
长时间运行也没有问题
退出的时候,偶尔会发生问题,注意是偶尔
使用日志监控,发现主服务线程成功结束,然后释放内存等也全部成功结束
最后返回MAIN函数,日志记录到也是成功结束
可以偶尔会发生错误,发生错误时日志也可以看到所有的结束动作都是成功的
也就是已经到了MAIN( )函数的RETURN部分了
接下去是一些类的自我释放,这个无法监控到了
但是同样的类,用在另外一个程序中,无任何问题,测试中也没有问题
怪了
怪还怪在服务结束后大约3-5秒,系统才弹出错误提示框,
内容类似
Server=watson.microsoft.com
UI LCID=2052
Flags=1674066
Brand=WINDOWS
TitleName=XXXXXXX.exe
DigPidRegPath=HKLM\Software\Microsoft\Windows NT\CurrentVersion\DigitalProductId
ErrorText=如果您正执行到一半,您的未保存的信息可能会丢失。我的监控日志可以记录到已经执行到MAIN( )返回了
 2007 04-12 12:49:53 A and U thread exit ok
 2007 04-12 12:49:53 Free user data ok
 2007 04-12 12:49:53 Free thread memory ok
 2007 04-12 12:49:53 End Memory Pool ok
 2007 04-12 12:49:53 Flush memory log ok
 2007 04-12 12:49:53 My service of xxxxxxx  exit ok! *
 2007 04-12 12:49:53 --------Stop myservice successfully done--------
 2007 04-12 12:49:53 Service main: success waiting for thread end , now to close handle
 2007 04-12 12:49:53 Server stop: Now to End Tcp
 2007 04-12 12:49:56 Server stop: Now to Call CoUninitialize
 2007 04-12 12:49:56 ----XXXXXXXX service now exit successfully----注意,这个错误不是每次都发生,是偶尔发生

解决方案 »

  1.   

    稳定出现是做不到的
    但是能监控的地方我都监控到,而且都是正确的
    我看网上有人说是杀毒软件的监控模块引起类似问题,不知道是不是
    因为发生错误的时候我已经监控到MAIN( )函数成功返回了,接下来是堆栈的释放,我无法监控了
    哎,真头大
    运行出问题还好,TMD都主程序退出了还出问题
      

  2.   

    ---- xxxxxxx catch exception ----
     2007 04-12 15:49:40 Error context code: 65599 : 1003F 
     2007 04-12 15:49:40 Error exception code :3221225477 : C0000005 
     2007 04-12 15:49:40 Error exception Flags: 0  : 0 
     2007 04-12 15:49:40 Error exception NumberParameters: 2  : 2 
     2007 04-12 15:49:40 GetLastError: 2  : 2 
    这是我用自己的异常处理函数捕获的
    内存读写冲突
    可看日志记录,MAIN已经返回了
      

  3.   

    不是内存泄露
    我已经通过日志+ATTACH+COMMAND LINE 联合比对,定位到异常所在了
    目前暂时判断是线程退出的时候不同步,有一个关键变量提前被销毁了
    服务进程真TMD难调试
      

  4.   

    我调试WinService程序的时候,所有线程都加try和Catch,一旦发生错误,全部记录日志
    而且new和delete全部重载,delete的时候发现提早销毁也全部记录日志
    所有的互斥都自己包装一个类, 对已经销毁的对象操作的时候也记录日志......当然,以上都是在#define中有定义一个_DEBUG_SERVICE, 取消掉这个定义就和普通代码一样了希望对你有帮助
      

  5.   

    谢谢
    和线程内部代码的异常没有直接关系,是退出顺序错了
    我没彻底理解ServiceMain的作用
    因为我是用API直接写的
    这里就有个MAIN( )函数的执行转移问题
    我理解错了,因此退出的时候没有考虑到顺序,目前定位到的异常就是这里
    我全局有TRY CATCH结构的,异常处理函数也自己写的
    但是在我这里没有用,因为这里很特殊,明天继续调试,应该就是这里的问题了加Try catch代码效率有点问题,如果内部代码真有问题,还是直接让它报告错误的好
    在服务器软件里,带错运行比较可怕
      

  6.   

    问题解决了,
    确实是我理解问题,
    不过这里的MAIN()和全局变量的关系实在令人费解
    还好最后解决掉了