6

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

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

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

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

谢谢。

4

5 回答 5

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);
}
于 2010-11-15T18:41:12.863 回答
2

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

于 2010-11-16T01:10:54.893 回答
1

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

于 2010-11-15T19:27:03.990 回答
0

啊! 艰难的一...

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

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

祝你好运=/

于 2010-11-15T18:41:12.787 回答
0

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

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

于 2010-11-16T01:16:55.550 回答