Speicherlecks im VDR finden

Posted by Tobi Sun, 30 Apr 2006 10:27:00 GMT

Wer sich etwas mit C / C++ auskennt weiss, dass auch dem besten Programmierer in diesen Sprachen früher oder später mit Sicherheit ein Fehler unterläuft: Speicher wird reserviert und dann nicht freigegeben. Solche "Speicherlecks" können auch in VDR und den VDR-Plugins auftreten. Um diese Art von Bugs zu finden, gibt es valgrind. Mit Version 1.3.49-1ctvdr2 habe ich eine kleines Hilfsskript für Valgrind in das VDR-Debug-Paket (vdr-dbg) eingebaut.

Installation

Um Speicherlecks finden zu können, ist eine Debug-Version von VDR nötig. Diese könnt ihr mit

apt-get install vdr-dbg

ganze einfach installieren. Das beinträchtigt in keinster Weise die Funktion des normalen VDR, weshalb vdr-dbg problemlos auch auf "Produktivsystemen" eingesetzt werden kann (Ist Fernsehen produktiv?). Vorsicht ist nur geboten, wenn Einstellungen geändert oder Aufnahmen gelöscht werden, denn vdr-dbg greift auf das selbe Aufnahmeverzeichnis und die selben Einstellungen zu!

Aufruf

Der Aufruf muss als root erfolgen:

vdrleaktest

Standardmäßig wird damit der Speichertest allein für VDR gestartet. Es werden keine Plugins geladen.

Ist der VDR gestartet, könnt ihr tun, wovon immer ihr der Meinung seid, dass es zu einem Speicherleck führen könnte. Mit valgrind läuft VDR etwas träger und langsamer. Daher müsst ihr schonmal ein paar Sekunden auf eine Reaktion warten.

Um VDR zu beenden, wählt im Menü Einstellungen den Punkt Neustart. Die Debug-Version wird damit beendet und der normale VDR gestartet.

Das Ergebnis

Das Resultat eurer Bemühungen findet ihr dann in /tmp/memleaktest.log. Von Interesse sind vor allem die "definitely lost"-Einträge. Valgrind hinterlegt dort einen kompletten Stacktrace bis hin zur Reservierung des Speichers, der nich freigegeben wurde.

Nun könnt ihr in den VDR-Quelltexten stöbern, um das Problem selber zu beheben. Oder aber ihr wendet euch mit dem Stack-Trace an den VDR-Experten eures Vertrauens. Die englischsprachige VDR-Mailingliste oder die des Debian VDR Packaging Teams bieten sich dafür an. Dort solltet ihr natürlich auch eure Lösung posten, falls ihr selber eine finden konntet. Bei Problemen in Plugins sollten auf jeden Fall auch die Plugin-Autoren benachrichtigt werden (siehe /usr/share/doc/vdr-plugin-???/copyright).

Testen von Plugins

Zunächsteinmal ist es notwendig, auch vom zu testenden Plugin eine Debug-Version zu installieren. Diese müsst ihr jedoch selber compilieren. Das geht mit

vdrdbg-buildpackage -tc -uc -us -rfakeroot

analog zu dpkg-buildpackage (siehe hier) aber recht einfach.

Um auch Plugins in die Speicherleckprüfung einzubeziehen, müssen diese beim Aufruf von vdrleaktest als Parameter übergeben werden. Auch etwaige Plugin-Optionen, die normalerweise aus /etc/vdr/plugins/plugin.???.conf geladen werden, müssen von Hand angegeben werden.

Da mit Beenden von VDR die Plugins entladen werden, kann valgrind keine Symbolinformationen mehr zuordnen. Mit der Option -k bzw. --keep-plugins sollte beim Testen von Plugins deren Entladen daher unterbunden werden.

vdrleaktest -k -P'podcatcher --cache=/var/cache/vdr-plugin-podcatcher'

Zu beachten ist, dass bei Angabe von -k natürlich die Aktionen, welche beim Entladen der Plugin-Bibliotheken normalerweise erfolgen, nicht mehr ausgeführt werden. Das Betrifft die Deinitialisierung von Bibliotheken, die vom Plugin verwendet werden, sowie das Freigeben globaler Objekte, die mit dem Laden der Plugin-Bibliothek erzeugt wurden. Solche globalen Objekte sollten aber tunlichst vermieden werden. Mit dem Löschen der cPlugin-Instanz sollten auch alle andern Objekte gelöscht werden.

Es ist ratsam, immer nur ein Plugin zu laden, da ansonsten Performance und Lesbarkeit des Logs leiden.

Noch ein paar Hinweise

Bevor ihr einen Speicherfehler meldet, prüft bitte auch, ob dieser mit einem ungepatchten VDR (vdr-standard) auftritt. Gebt immer an, in welcher Pakteversion und mit welchen Patches (dpkg -s vdr | grep patchlevel) der Fehler auftritt.

Ich denke, bei der Komplexität von VDR und der Vielzahl von Plugins gibt es jede Menge Speicherlecks, die aufgespürt werden wollen. Also dann:

Möge die Jagd beginnen!

Posted in  | Tags , , ,  | no comments

Comments

Comments are disabled

 

Categories

Tags

.NET debian dkb mono Notebook squeeze squeezevdr survey vdr visa