Как бороться с утечкой памяти у чужого драйвера - PullRequest
6 голосов
/ 15 ноября 2010

Я запускаю программу переменного тока на компьютере CentOS 5.5.Программа запускает цикл, который выполняет тесты снова и снова, пока внешнему источнику не будет приказано остановиться.

По необходимости я использую старый драйвер для карты PCI, которая связывается с моей тестовой системой.С момента обновления с CentOS 4.5 до 5.5 я заметил, что могу просматривать мою программу только 175 раз.В это время программа останавливается с ошибкой, выделяющей кучу памяти.Я могу наблюдать за объемом используемой памяти по 10–20 МБ каждый раз, когда программа зацикливается, а системе просто не хватает памяти.Когда я выхожу из программы, используя Cntrl-C, память сразу освобождается.

Я использовал Valgrind, который указывает на утечки памяти в старом драйвере.Компания, написавшая драйвер, теперь поддерживает только Windows, и она не обновляла драйвер более 5 лет.

Без исходного кода есть ли способ освободить память, используемую драйвером, каждый раз, когда я перебираю свою программу?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 16 ноября 2010

Возможно возможно , что, хотя Valgrind показывает распределение утечки как выполненное в коде драйвера, проблема все еще в вашем коде. Это может произойти, например, если драйвер предоставляет функцию типа «free» или «release», которую он ожидает от вашей программы, а вы этого не делаете.

2 голосов
/ 15 ноября 2010

Если вы объявляете доступ к тестовой системе через драйвер внутри цикла, это должно выводить его из области действия на каждой итерации.

Что-то вроде следующего:

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 голос
/ 15 ноября 2010

Создайте новый процесс для каждого N использований драйвера (~ 175 должно работать) и обменивайтесь данными с родительским процессом через любой вид IPC.

0 голосов
/ 16 ноября 2010

Является ли драйвер автономным компонентом, или это библиотека, которая связана с вашей ЭЛТ? Если последнее - то есть, если оно ожидает связывания с malloc () вместо предоставления своего собственного - вы можете переопределить используемое им malloc (), заставив его ссылаться на собственную реализацию. Как только это будет сделано, вы управляете кучей и можете «перезапустить» драйвер, не прерывая процесс.

Именно так мы поступили с некоторыми утечками сторонних библиотек, которые нам нужно было связать с потребительским продуктом.

0 голосов
/ 15 ноября 2010

Тьфу! Жесткий, ...

Можете написать собственное управление памятью, обернуть собственное управление ОС и связать со старым драйвером? Я честно не знаю, можно ли это сделать.

Кроме того, вы можете попытаться объяснить проблему компании, написавшей этот драйвер, и попросить старый код.

Удачи = /

...