【问题标题】:How to deal with memory leak from someone else's driver如何处理来自其他驱动程序的内存泄漏
【发布时间】:2011-05-10 09:52:43
【问题描述】:

我在 CentOS 5.5 计算机上运行 c 程序。该程序运行一个循环,一遍又一遍地执行测试,直到被外部源告知停止。

我必须使用旧驱动程序来与我的测试系统通信的 PCI 卡。自从从 CentOS 4.5 升级到 5.5 后,我注意到我的程序只能循环 175 次。那时程序因分配堆内存的错误而停止。每次程序循环并且系统内存不足时,我可以看到内存在 10 到 20 MB 的块中使用。当我使用 Cntrl-C 退出程序时,内存立即被释放。

我使用了 Valgrind,这表明内存泄漏在旧驱动程序中。编写驱动程序的公司现在只支持 Windows,并且他们已经超过 5 年没有升级驱动程序了。

如果没有源代码,有什么方法可以在每次循环执行程序时释放驱动程序使用的内存?

谢谢。

【问题讨论】:

  • 驱动是运行在用户空间还是内核空间?

标签: c memory-leaks driver centos5


【解决方案1】:

驱动程序是作为独立组件提供的,还是链接到 CRT 的库?如果后者——也就是说,如果它希望链接到 malloc() 而不是提供它自己的——你可以通过强制它链接到你自己的实现来覆盖它使用的 malloc()。完成后,您可以控制其堆,并且可以“重新启动”驱动程序而无需终止进程。

这正是我们处理某些需要链接到消费产品的泄漏第三方库的方式。

【讨论】:

    【解决方案2】:

    可能即使 Valgrind 显示泄漏分配是在驱动程序代码中进行的,但问题仍然存在于您的代码中。例如,如果驱动程序提供了一个“免费”或“释放”类型的函数,它希望你的程序调用它,而你没有这样做,就会发生这种情况。

    【讨论】:

      【解决方案3】:

      为驱动程序的每 N 次使用创建一个新进程(大约 175 个应该可以工作),并通过任何类型的 IPC 与父进程通信。

      【讨论】:

        【解决方案4】:

        如果您通过循环内的驱动程序声明对测试系统的访问,这应该使其超出每次迭代的范围。

        类似于以下内容:

        char readbuf[512];
        for (int i = 0; i < countloops; i++) 
        {
           int fd = open("/dev/com1", O_RDWR);
           readbuf = read(fd, sizeof (readbuf));
           close (fd);
        }
        

        【讨论】:

        • 您假设它在 FD 关闭时释放“泄漏”内存。可能不是这样的。
        • 来自 OP “当我使用 Cntrl-C 退出程序时,内存立即被释放。”这会让我相信内存在关闭时被释放。
        【解决方案5】:

        啊!艰难的,...

        可以编写自己的内存管理,包装原生操作系统管理,并将旧驱动程序链接到那个吗?老实说,我不知道是否可以做到。

        另外,您可以尝试向编写此驱动程序的公司解释问题,并很好地询问旧代码。

        祝你好运=/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-25
          • 2013-09-06
          • 2014-11-21
          • 1970-01-01
          • 2019-07-06
          • 2017-08-11
          • 2011-01-13
          • 2012-07-01
          相关资源
          最近更新 更多