编的一个程序,有时候执行几天没事,有时候执行几小时就崩溃了,自动关闭。
用FASTMM跟踪不报错、用eurekalog跟踪不报错,打开Map也没记录。用的插件都是大路货,如Indy,dbgrideh,有用多线程,但没有反复创建释放。想了解,有哪些原因会导致不报错,程序会直接自动关闭?

解决方案 »

  1.   

    访问内存中已释放的对象时可能会崩溃 ,如果是这个问题,FASTMM会报错的。但没有。你说的是什么日志?
      

  2.   

    还有就是你用了Indy组件,那在你程序中最好要加一个dAntiFreeze组件
      

  3.   

    这类无声无息死掉有以下几种可能:
    1、Statck Overflow栈溢出,这类错误主要查是否在函数体内分配了大的数组或结构体,另外检查函数递归问题;
    2、有未截获的异常处理,这类错误如果是服务也会无声无息死掉,应用程序一般会弹错误框;
    3、内存或线程申请太多,操作系统杀掉你的程序;
    4、是否访问了系统的禁区,造成了Ring 0级的错误;建议输出一些运行日志,看程序是在那一步死掉的,另外如果是多线程程序,程序不稳定可以从查并发入手。
      

  4.   

    我也有遇到过类似的问题、同样也是用了indy、在线程中有动态创建TIdHttp获取网上的内容、我为了防止获取失败造成线程的锁死、就设置了idhttp的超时、并放在try里面、结果运行没两分钟就自动管理、无任何提示、可是我只要把try语句去掉就没有问题了、这个问题我至今觉得很奇怪
      

  5.   

    哦,是自己输出日志啊,看来我需要做一个这样的工作来自己进行跟踪了。在线程里使用INDY,也需要在主程序放idAntifreeze吗?它的作用不是消息接收吗?
    “1、Statck Overflow栈溢出,”这个是要报错的吧?“另外检查函数递归问题;”没有使用递归。“2、有未截获的异常处理,这类错误如果是服务也会无声无息死掉,应用程序一般会弹错误框;”我是应用程序,不是服务,应该报错吧。
    “3、内存或线程申请太多,操作系统杀掉你的程序;”这个有可能,我现在虽然使用了多线程,但程序启动就申请,结束才释放,中间没有再申请了。(为了排除IDHTTP的可能,我又换用了AUHTTP,它会每次访问都申请并释放一次线程,从监视的任务管理器看到,没有出现一直增加线程的情况)
    有办法查到当前程序的线程数和内容使用吗,这样我可以把它输出到日志里,因为每次人工监视时都没出问题,看任务管理器里的内存、线程又很正常;
    4、是否访问了系统的禁区,造成了Ring 0级的错误;这种情况,会不会在系统日志里留下记录?我查看了系统事件,没有相关信息。