一个简单的办法:
A只去启动B,不要KILL它.
当然每次启动之前判断一下是否已经启动了,已经启动了就不要再开一个了.这样如果B还是会被KILL的话,要么是第三方KILL的,要么是B本身有BUG,自己关闭了.

解决方案 »

  1.   

    To:1#,2#
          B骨子里其实是个service
          并且这个应用已经很有年头了,不可以随便做大的修改
    To:3#
          我描述bug现象有遗漏,A登录模块提供了一个 public static 方法用通过process.kill来关闭B应用,
          并且我能拿到的代码中只有登录模块在调用.
          但是,A应用里有1882个dll(.net),未统计的还有vb6,c++....并且不大可能拿到全部的源代码
          曾做过类似方案,在Kil时打log,被无情的否定了有没有办法跟踪一个process,知道它是被谁kill掉的!?
          
      

  2.   

    就是说,你A程序中可能有无数个模块都去操作B?
    设计的完全不合理啊.
    应该是只有1个模块去操作B,其他模块通过调用这个模块去操作B,而不是每个模块都去直接操作.
      

  3.   


    是这个理,理论上不应该.但是不敢排除!这东西有年头了,经手的人多啊!!即使是现在也同时有几十人在对应它的bug,或增加新功能
      

  4.   

    办法是有的,要挂应用程序全局钩子,在进程处理中拦截TerminateProcess 代码并不多
    参考http://www.blogjava.net/baicker/archive/2007/05/31/121108.html但是单纯用.Net似乎是挂不上这种全局钩子的
    如果在A应用中加一个守护功能,当发现B意外结束之后,马上又开启一个,这样岂不更简单?
      

  5.   


    是这个理,理论上不应该.但是不敢排除!这东西有年头了,经手的人多啊!!即使是现在也同时有几十人在对应它的bug,或增加新功能
    我这边的对应流程是,上面发依赖过来.我们找原因,找到后做详细设计反馈回去,上面收到后评价,如果没问题,才可以后续的工作.
    原因必须要找到,不可以绕过...(上面发依赖的人变态啊!总是为什么啊为什么不明白啊不明白!)
    现在我根本没办法再现bug(这事肯定是个案,现场也在国外),c++ 是七窍通了六窍.....
      

  6.   

    Quote: 引用 7 楼 dongxinxi 的回复:

    办法是有的,要挂应用程序全局钩子,在进程处理中拦截TerminateProcess 代码并不多
    参考http://www.blogjava.net/baicker/archive/2007/05/31/121108.html但是单纯用.Net似乎是挂不上这种全局钩子的我这边的对应流程是,上面发依赖过来.我们找原因,找到后做详细设计反馈回去,上面收到后评价,如果没问题,才可以后续的工作.
    原因必须要找到,不可以绕过...(上面发依赖的人变态啊!总是为什么啊为什么不明白啊不明白!)
    现在我根本没办法再现bug(这事肯定是个案,现场也在国外),c++ 是七窍通了六窍.....
      

  7.   

    个人觉得啊,A程序调用B程序中的方法之前,先判断是否存在B的实例,如果B已经被关闭,那就调用Process.start打开B之后再调用,这样就不会有啥bug。
      

  8.   

    这可以是解决bug一种方法,但是解决之前必须要找到产生bug的原因!