如何处理别人的驱动程序的内存泄漏

时间:2010-11-15 18:31:26

标签: c memory-leaks driver centos5

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

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

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

没有源代码,我每次循环程序时都可以释放驱动程序使用的内存吗?

感谢。

5 个答案:

答案 0 :(得分:2)

如果通过循环内的驱动程序声明对测试系统的访问,则应在每次迭代时将其置于范围之外。

如下所示:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

唉!艰难的,......

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

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

祝你好运= /

答案 4 :(得分:0)

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

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