关于程序自动退出,一般可能都是堆栈什么的出了问题,因此我也一直很关注这一块。
程序运行在2000操作系统下,通过usb转多串口来实现对底层硬件模块的操作,一直以来都没有出什么大的问题,今天将底层硬件的两个模块互换一下位置,程序大概在运行1个多小时后崩溃(我已经使用了异常处理机制,在CWinApp的构造函数中就加了捕获函数,但很遗憾,程序退出没有给出预期的错误对话框)。在系统日志上,发现了一个不正常的事件“RSM 无法管理 PhysicalDrive1 库。它遇到了一个未指定的错误。 造成这个错误的原因可能有几个问题,包括但不限于 数据库损坏、与库通讯失败或  没有足够的系统资源。”,经过在网上搜寻,并自己分析,可能原因有:供电不稳定(这个我也最担心,但是没有好的方式去证明),USB转多串口没有遵循Intel的规范(这个更难证明了,这个驱动以及硬件结构是外包的)。目前偶还没有什么好的办法去证明我的猜想,当然,程序也不一定就是一定没有问题(至少目前还想不出来造成程序崩溃的地方有哪些),因为在另外一台硬件结构完全不一样的机器上运行(连续一个月)一直没有出现任何问题,因此,可能是这台机器的某些硬件特性不同干扰了我的程序,而我的程序没有考虑到这种情况从而导致堆栈严重错误??????可我已经做了崩溃处理了啊
郁闷中,同时散分。希望各位给我一些建议,调试的建议,不胜感激!

解决方案 »

  1.   

    在有关退出和关闭的那些函数里加一些Messagebox看从那儿退出的。
      

  2.   

    一般程序自动退出,你先检查一下程序内部确实有调用退出函数如(exit之类的).
    如果没有以上情况,就有很有可能是堆栈被破坏.函数返回的地址被错误的改写,程序跳到未知的位置去了.
    如果想确定是不是堆栈被破坏造成的.应该没有什么好办法.(至少我不知道),只能在调试状态下运行,退出后检查调用栈.如果调用栈不完整,或者调试器根本无法显示调用栈,那一定是堆栈错误.
      

  3.   

    资源耗尽这点可以排除(另外一台机器上已经运行很长时间了就是一个旁证,同时这台机器也是今天才出现的,以前也运行过很时间)没有调用任何exit等不友好函数我在CWinApp的构造函数中加入了
    _set_se_translator(SeTranslator);
    SetErrorMode(SEM_NOGPFAULTERRORBOX);
    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    来捕获异常,为什么会捕捉不到?
      

  4.   

    构造函数中设置了SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);后
    理论上任何程序异常都会自动调用我的MyUnhandledExceptionFilter异常处理函数,可是没有
      

  5.   

    刚看到标题时认为数组溢出的可能性大一些,仔细看了你描述的症状后不敢插嘴了,因为没弄过这个方面的。不知道下面这个贴中的内容对你有没有帮助:
    http://community.csdn.net/Expert/topic/4470/4470922.xml?temp=.9018061
    里面sxslyy(孤松傲雪)朋友的意见不妨一试,Good luck!
      

  6.   

    在debug态下是否也有退出,退出时是否有什么message?
      

  7.   

    谢谢各位。昨晚换回去以后没有出现程序退出的问题现在正在跟做硬件的商量相关问题如果供电不足,会出现什么问题,USB转虚拟串口的这些串口会不会瞬间丢失?如果真的丢失,会破坏系统吗?
      

  8.   

    这个问题前几天刚有人问过,你可以搜索一下
    另外,我个人感觉USB转串口不可靠,多串口我觉得用PCI得串口卡或串口服务器是更好的解决方案。
      

  9.   

    USB转串口怎么会不可靠呢?
    目前市面上已经有许多这样的产品了,特别在销售到外国方面的小产品。
    搂主出现的这种问题,比较异常,
    毕竟还是需要看你的硬件跟驱动的兼容性问题,USB驱动要涉及到电源管理方面的处理的。
      

  10.   

    我用过几种USB转串口,感觉都不太可靠,尤其是传输大量数据时容易丢。
    RS232是靠电压传输的,国内几十元的产品有几个有保护电路?
      

  11.   

    有调试环境吗?vc或者softice
    如果不便安装调试环境,打开drwtsn32,监控一下。
    蛛丝马迹总可以找到。驱动有问题的可能性很大。
      

  12.   

    如果系统蓝屏转储,可以用windbg分析一下内存转储文件. 感觉是驱动的问题.