我有个程序(vc6+sp5,运行在win2003,sp2上),接收到服务器通过tcp/ip发送过来的信息,然后存储到数据库(sql 2005 express,写数据库部分在线程里面执行)中,同时根据接收到信息的内容通过TCPIP转发到各个客户端,该程序运行7到8天就会崩溃一次,有时候2,3天,有时候10多天,以下我给出drwtsn32记录的简单信息,我也有dmp文件和log,但不知道怎么去分析它,网上google了半天也没找到有效的信息,如果您有兴趣,给我留言,我可以把他发给你。The application, C:\Program Files\sgl\SGL.exe, generated an application error The error occurred on 08/17/2008 @ 06:39:08.741 The exception generated was c0000005 at address 488933BB (ODBC32!MpHeapFree)For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.====================================================
ODBC32!MpHeapFree?是不是意味着数据库访问方面出的问题,如果是,可能是什么问题呢,但我仔细查看过数据库访问的代码,没有问题啊,只是简单的insert数据操作,我是在每次需要访问数据库的时候打开数据库,insert提交完就close掉。希望高手指点下,以上问题可能的原因,或者,如何去分析dump文件,在此先行谢过!

解决方案 »

  1.   

    这种错误很难查,c0000005的意思是非法访问内存,根据ODBC32!MpHeapFree这个名称来看,是释放内存时给出的指针无效,你可以查看相关代码,注意一下是否存在重复释放,或者存在内存越界覆盖了其它数据。另外在相关代码中加入写日志文件方面的处理,记录有关信息以便分析。
      

  2.   

    你看看你的程序是不是出现了多线程同步问题.ODBC32!MpHeapFree出错,应该是不正确的调用了ODBC释放资源函数..检查你的数据库操作代码.注意资源释放的地方.
      

  3.   

    生成pdb符号文件,然后用windbg运行程序,崩溃后,再调试
      

  4.   

    如果exe在客户端运行,则在codeproject上搜索crashrpt,集成到exe里,功能是崩溃后生产dump文件,然后再用windbg调试
      

  5.   

    c0000005是非法访问的错误,ODBC32!MpHeapFree是指ODBC32中的多线程堆栈释放,在多处理器的机器中,通过临界区的控制MpHeap每个CPU可以实现对内存区的同时访问,这就有可能出现释放已释放了内存的问题。
      

  6.   

    这种错误确实很难查,我以前也遇到过这要的问题,写的服务程序也是运行7,8天以后就出错。基本上出错的原因都是内存问题。
    查错的方法有三种:
    1、写日志的方法:你现在已经确定是在数据库操作时出的错,这样你可以对数据库操作的地方加上详细的日志,每执行一句就写日志。如果出错程序退出,你就从日志文件反向扫描,这样就可以找到具体出错的代码行。
    2、再一个就是用drwtsn32来调试了,在程序编译选择中选择生成Map文件,程序出错后将drwtsn32的dump文件vc2003环境下调用,这样出错后就可以通过内存地址和map文件一起就可以查到是哪一行代码出错了。
    3、再一种办法就是直接在调试状态下一直运行程序,这种得等好几天可能才会出错。不过这种方法是最有效的,我好多的服务器程序都是通过这种方法解决了不少bug.
      

  7.   

    谢谢楼上各位朋友的热情相助,我已在程序里面添加相关的log,现在就等待下一次崩溃了。
      

  8.   

    使用drwtsn32调试,Crash dump type是不是得设置为full?
    我没办法在调试状态下运行程序,公司不容许把代码放到客户的机子上跑