none
怎么分析非托管内存是否有泄露? RRS feed

  • 问题

  • 有个7*24小时运行的小程序,经常会报各种奇怪的错误,怀疑是有内存泄露,

    用dot memory查了托管的部分,该改的都改了,还是报错,

    有时候是数据库,有时候是GDI,有时候是虚拟打印机。。。

    重启一下,就又好使了,所以,怀疑是非托管内存的问题,

    请问,用什么工具能查看是否有非托管资源的泄露问题?

    2022年3月14日 8:55

全部回复

  • c/c++里的内存泄漏是指已分配的内存没有释放,这个不会报错,只是内存的使用量不停增长。当然如果把内存都给耗尽了,那程序也会崩溃,但即使这样也不会报错。内存泄漏是编程上的疏忽,并非错误,所以不可能给您报出什么数据库、打印机错误的。如果是访问了空指针或悬挂指针,那第一次运行就会崩溃,不可能重启一下就好了。这样的错误和运行多长时间没关系,只要一运行到这部分代码就会崩溃。不知道您所说的报错是操作系统报错,还是.net报错,还是调试时vs报错,也不知道您的错误信息是什么,如果错误信息由非托管代码报出,那肯定不是内存问题,内存问题只会崩溃不会报错。
    2022年3月14日 10:45
  • 我说的不够准确:是程序卡死,看log里的错误的信息要么是打印时,要么是GDI,要么是数据库取数据时。

    错误的log:

    1)

    2022/2/16 10:50:29 句柄无效。
       在 System.Drawing.Printing.StandardPrintController.OnStartPage(PrintDocument document, PrintPageEventArgs e)
       在 System.Drawing.Printing.PrintController.PrintLoop(PrintDocument document)
       在 System.Drawing.Printing.PrintController.Print(PrintDocument document)
       在 System.Drawing.Printing.PrintDocument.Print()

    2)


    2022-03-13 08:06:33: re:System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: System.Data.OracleClient.OracleException (0x80131938): ORA-03113: end-of-file on communication channel
    Process ID: 4064
    Session ID: 83 Serial number: 46423

       在 System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
       在 System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
       在 System.Data.OracleClient.OracleCommand.ExecuteScalarInternal(Boolean needCLStype, Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
       在 System.Data.OracleClient.OracleCommand.ExecuteScalar()
       在 Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteScalar(IDbCommand command)
       在 Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteScalar(DbCommand command)

    2022年3月15日 6:37
  • 这看起来不像是内存泄漏,而是程序设计上有问题,可能是打印、存储数据过多缓存不够,或者发起的操作数量过多导致资源被耗尽之类的,能有错误记录就说明是“意料之中”的问题。内存泄露是“意料之外”的问题,因疏忽导致了内存没有被回收,这不会报错也不会卡死,内存泄漏如果最终将内存耗尽,那么程序通常会被操作系统直接给终止掉,您也可以查看任务管理器中的内存开销是否有异常增长。从您提供的信息看,这应该是打印、数据库等功能的调用方没有合理设计好操作流程,减少调用次数和频率,将打印、数据库等操作分开,简化问题后再调试,找出程序卡死的相关代码,针对这部分代码进行压力测试。
    2022年3月15日 8:12