[gelöst] [vdr 2.1.8+] Segfault seit eit_memleak-patch

  • Hallo zusammen,
    nachdem ich soeben in meinen Desktop-Rechner eine Sat-Karte gebaut habe bricht VDR mit einem Segfault ab, sobald auf einen DVB-S-Kanal geschaltet wird. Es handelt sich um eine (recht alte) Technisat Skystar 2 (b2c2-flexcop-pci aus Debian Kernel 3.16.0-4).


    Mit 2.1.8 läuft das System rund, nachdem der pre-1 Patch eingespielt wurde nicht mehr. Mit Das Erste HD, welchen die SkyStar nicht wiedergeben kann, startet der VDR zumindest. Schaltet man auf einen DVB-S-Kanal um führt dies zu einem Speicherzugriffsfehler. Steht der letzte Kanal auf z.B. RTL bricht VDR sofort beim Start ab. Ich habe daraufhin den pre-1 Patch wieder herausgenommen und wollte die Komponenten einzeln nacheinander integrieren. Bereits der erste Teil ([PATCH] Memory leak im EIT Scanner bei kaputtem EPG) führte wieder zu den Abstürzen.


    Hier der Backtrace von gdb


    Es wurden sonst keine Patches integriert. Der Test gab mit xineliboutput und komplett ohne Plugin (=>ohne Ausgabedevice) das gleiche Ergebnis.
    Weitere Eingabedevices gibt es nicht, bisher wurde der VDR nur zum schauen und schneiden von Aufnahmen verwendet.


    dvbsddevice wird doch soweit ich weiß nur für FF-Karten bzw. die Ausgabe benötigt(?). In einem anderen VDR mit TT S2-6400 läuft vdr-2.1.8 mit besagtem Patch einwandfrei.


    Clemens

    VDR 1: Asus E35M1-I, RAM: 8GB, SSD+HDD, TT S2-6400, Debian Jessie, vdr-2.1.x

    Einmal editiert, zuletzt von acb321 ()

  • Der Patch sieht so harmlos aus, ich kann mir fast nicht vorstellen, daß der solche Auswirkungen haben sollte.


    Kannst du testweise mal in DescriptorGroup::Add() an den beiden 'return false' Stellen stattdessen 'true' zurückgeben? Damit sollte es sich wieder genauso verhalten wie vorher, halt nur mit dem geänderten Interface.


    Klaus

  • Hallo Klaus,
    erstmal Entwarnung für die nächste Stable.


    Vor dem Test wollte ich das ganze nochmal mit false reproduzieren und dann klappte es plötzlich. Der einzige Unterschied war, ich hatte zwischenzeitlich ein make distclean gemacht. Die Zeitstempel im Sicherungsordner zeigen, dass das Problem nicht im C-Code, sondern im Makefile steckt:

    Code
    $ ls -la vdr eit.* libsi/si.* libsi/libsi.a 
    -rw-r--r-- 1 acb321 staff   19368 Feb  4 22:05 eit.c
    -rw-r--r-- 1 acb321 staff 	501 Jan  3  2010 eit.h
    -rw-r--r-- 1 acb321 staff  263912 Feb  4 22:05 eit.o
    -rw-r--r-- 1 acb321 staff 2102478 Feb  1 20:49 libsi/libsi.a
    -rw-r--r-- 1 acb321 staff   24066 Feb  4 22:05 libsi/si.c
    -rw-r--r-- 1 acb321 staff   22589 Feb  4 22:05 libsi/si.h
    -rw-r--r-- 1 acb321 staff  500368 Feb  1 20:49 libsi/si.o
    -rwxr-xr-x 1 acb321 staff 6271920 Feb  4 22:05 vdr


    Das ist der Inhalt nach einem "make all" im Hauptverzeichnis. Wie man sieht wurde die libsi/si.o nicht aktualisiert, daher auch nicht die libsi.a.
    Die bisher von mir genutzten Patche haben nur die eigentlichen VDR-Daten angefasst, daher genügte ein einfaches make immer.


    Führt man im Unterordner libsi ein "make all" aus werden die Dateien aktualisiert. Ein anschließendes make im Hauptordner macht den Rest.
    Nebenbei: Nur "make" genügt unter libsi nicht, dann wird nur die utils.o (erstes Element der OBJS) aktualisiert bzw. geprüft.


    Zumindest mit dem vollständigen pre-1 Patch funktioniert es nun. Morgen gleich mal sehen was die 2.1.9 sagt.


    Danke für deine Mühen!


    Clemens

    VDR 1: Asus E35M1-I, RAM: 8GB, SSD+HDD, TT S2-6400, Debian Jessie, vdr-2.1.x

  • Da bin ich aber froh, daß das doch noch eine Erklärung gefunden hat.


    Mir fällt leider auch keine saubere Lösung dafür ein, bei einem "make all" (oder auch nur "make vdr") im Hauptverzeichnis automatisch ein eventuell nötiges Neuübersetzen im "libsi"-Verzeichnis anzustoßen. Dazu müsste ja das VDR-Makefile wohl die Abhängigkeiten innerhalb des "libsi"-Makefiles kennen, was ich aber gerne vermeiden würde.


    Vielleicht weiß ja ein "Makefile-Guru" hier, wie man das einfach und sauber hinbekommen könnte...


    Klaus

  • Was macht denn make all und make vdr?


    Bei mir hat bisher immer ein "make clean && make clean-plugins && make" ausgereicht, um VDR und Plugins neu zu bauen.


    Oder ist das abhängig, auf welchem System man baut?

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Wenn du vorher "make clean" machst gibt es kein Problem.
    Das Problem besteht nur dann, wenn man im "libsi"-Verzeichnis etwas ändert und dann im VDR-Verzeichnis einfach nur "make" macht, ohne vorheriges "clean" (bzw. vorheriges "make" innerhalb des "libsi"-Verzeichnisses). Das Makefile prüft zwar die Abhängigkeit von libsi/libsi.a, aber nicht, ob libsi.a selber aktuell ist.


    Klaus

  • Je nachdem wie viel im Code geändert wurde und wie viele Plugins hinterlegt sind gibt es schon eine ziemlichen zeitlichen Vorteil nur make laufen zu lassen ohne vorher alles bereits erledigte wegzuschmeißen.
    Das ist normalerweise auch der erste Schritt wenn etwas nicht funktioniert - war gestern wohl doch zu spät.



    Hiermit würde es zumindest für make bzw. make all funktionieren. Für make vdr würde es nicht genügen. Wenn man da auch auf das virtuelle "build-$(SILIB)" verweisen würde dann würde die vdr-binary immer neu gebaut werden.
    Eine andere Idee hätte ich nicht, aber ich bin auch sicherlich kein makefile-guru 8)


    Clemens

  • Da bin ich irgendwie nicht so begeistert davon, weil es zum einen die Zeile für den Make-Aufruf für libsi vollständig dupliziert, und zum anderen das Problem nicht vollständig löst.
    Eine vollständige Lösung müsste schon bei "make vdr" greifen, alle anderen Targets ergeben sich dann ja von selber.
    Aber vielleicht muss man damit halt einfach leben. So oft ändert sich libsi ja nicht...


    Klaus

  • Ich wuerde es so machen:


    Gruss,
    S:oren


    Edit: Wahrscheinlich haette es ausfuehrlicher "add dependency to nonexistent file with empty make rule -> always call sub-make" heissen muessen...

  • Das sieht zwar auf den ersten Blick vielversprechend aus, und tut auch das, was es soll.
    Aber wenn alles aktuell ist und man macht


    make vdr


    dann kommt nicht mehr


    make: 'vdr' is up to date.


    sondern


    make[1]: Nothing to be done for 'all'.


    Gut, wenn man


    make plugins


    macht und alles ist aktuell, dann kommt auch


    *** Plugin dvbhddevice:
    make[1]: Nothing to be done for 'all'.
    *** Plugin dvbsddevice:
    make[1]: Nothing to be done for 'all'.
    *** Plugin epgtableid0:
    make[1]: Nothing to be done for 'all'.
    *** Plugin hello:
    make[1]: Nothing to be done for 'all'.
    ...


    insofern ist das vielleicht auch nicht so schlimm. Der Vorteil, daß garantiert immer neu übersetzt wird, wenn es nötig ist, überwiegt hier wohl.


    Weiß vielleicht noch jemand, wie man diese "make[1]: Nothing to be done for ..." Meldungen unterdrücken könnte?


    Klaus

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!