Compile Warnings in vnsiserver

  • wäre da ein &p nicht besser?

    'for (auto& p : s_Pool)' arbeitet mit dem object selbst und erspart in jedem Fall eine Kopie des members von s_Pool.

    Ich denke das wäre hier angebrachter, aber dann könnte man eben im loop auch p selbst ändern.

    Mich wundert auch die Zeile 467

    auto recv = p.lock();

    p ist vom Typ std::weak_ptr, dessen Beschreibung sagt

    std::weak_ptr is a smart pointer that holds a non-owning ("weak") reference to an object that is managed by std::shared_ptr. It must be converted to std::shared_ptr in order to access the referenced object.

    std::weak_ptr models temporary ownership: when an object needs to be accessed only if it exists, and it may be deleted at any time by someone else, std::weak_ptr is used to track the object, and it is converted to std::shared_ptr to assume temporary ownership. If the original std::shared_ptr is destroyed at this time, the object's lifetime is extended until the temporary std::shared_ptr is destroyed as well.

    Die Zeile macht wohl eine implizite Konversation zu einem std::shared_pointer innerhalb des loops.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Die Zeile macht wohl eine implizite Konversation zu einem std::shared_pointer innerhalb des loops.

    Sogar eine explizite, wenn man sich den Rückgabewert der lock() Methode ansieht - soweit ich das verstanden habe, hat C++ 11 mit dem shared_ptr einen Smartpointer, der Reference-Counting macht (so dass der automatisch aufgeräumt werden kann, wenn niemand mehr einen nutzt) und beim Kopieren den Reference Count inkrementiert (und wieder dekrementiert, wenn ein Smart Pointer out of scope geht). weak_ptr ist eine Variante, die den Reference Count ebenfalls führt, aber nicht inkrementiert (und auch Kopien eines weak_ptr scheinen die Anzahl der für ein Objekt existierenden shared_ptr richtig zu tracken) - das ist dazu gedacht einen shared_ptr zu beobachten zu können, ohne Einfluss auf die Lebensdauer des von ihm verwalteten Objekts zu haben.

    Was diese Smart Pointer nicht machen, ist irgendwelche Mechanismen bereit zu stellen, die den Zugriff auf die von ihnen verwalteten Objekte threadsafe zu machen - das muss man dann trotzdem noch mit einem Mutex, atomaren Operationen usw. lösen - ob die von dem weak_ptr bzw. smart_ptr verwalteten Objekte von mehreren Threads manipuliert werden, habe ich mir noch nicht angesehen.

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Ich habe mir nochmal das Log angeschaut, dabei ist mir aufgefallen, das immer folgende Sequenz vor dem Crash erscheint:

    Code
    Feb 01 22:14:01 vnas2.home.arpa vdr[27209]: [27216] changing pids of channel 2169 (SWR RP HD) from 5131+5131=27:5132=deu@3,5133=mis@3,5137=qks@3;5136=deu@106:5135=deu:5134 to 5121+5121=27:5122=deu@3,5123=mis@3,5127=q>
    Feb 01 22:14:06 vnas2.home.arpa vdr[27209]: [27257] VNSI: Requesting clients to reload channels list
    Feb 01 22:14:06 vnas2.home.arpa runvdr.extreme[27209]: malloc(): unaligned tcache chunk detected

    also changeing Pids, dann macht vnsiserver folglich: Requesting clients..., dies führt zu: malloc(): unaligned tcache.

    Die obige Abfolge war gestern auch der letzte Crash, es folgten danach auch keine "changing pids of channel" mehr.

    Vielleicht hilft es bei der Analyse.

    Edited 2 times, last by RHS (February 2, 2024 at 10:53 AM).

  • Der Backtrace würde helfen.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Die obige Abfolge war gestern auch der letzte Crash, es folgten danach auch keine "changing pids of channel" mehr.

    Wie viele Clients hast du da normalerweise gleichzeitig am vnsiserver hängen?

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Versuche gerade einen Backtrace zu erzeugen:

    cd /home/<Dein User>

    ulimit -c unlimited

    gdb --args /usr/local/bin/vdr --cachedir=/tmp -c /etc/vdr -E /tmp -l 3 -L /usr/local/lib/vdr --localedir /usr/local/share/locale -P vnsiserver -t 14 -d -P satip -d 8 -r 20971520 "-s 192.168.20.245;192.168.20.183" -P dvbapi -P live -u vdr -v /pool/vdr-video -w 60

    set logging file backtrace.txt

    set logging on

    run

    Code
    Es gibt dann folgende Meldung: vdr: can't access terminal: 14 

    der vdr start bricht dann ab.

    ich starte vdr sonst über run-extreme welches durch systemctl gestartet wird.

    Wie müsste dann meine VDR Zeile aussehen?

  • Ich vermute mal da fehlt dir shell quoting, sonst bekommt nicht das Plugin die nachfolgenden Args, sondern vdr selbst.

    Code
    gdb --args /usr/local/bin/vdr --cachedir=/tmp -c /etc/vdr -E /tmp -l 3 -L /usr/local/lib/vdr --localedir /usr/local/share/locale -P "vnsiserver -t 14 -d" -P "satip -d 8 -r 20971520 -s 192.168.20.245;192.168.20.183" -P dvbapi -P live -u vdr -v /pool/vdr-video -w 60
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Danke. :)

    Das sagt dein log übersetzt.. Vielleicht liest ja jemand den entscheidenden Tip heraus, mir fällt nichts schlimmes auf.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Aus dem BT entnehme ich die Fehlermeldung malloc(): unaligned tcache chunk detected und mit dem Hinweis hier

    Quote

    It means that earlier on in your program, you've made a mistake — a buffer overflow or something similar. You have corrupted or overwritten the memory allocator's internal metadata. This was only detected at that malloc call.

    würde ich vermuten, du suchst an der falschen Stelle. Vielleicht könnte valgrind helfen oder der gcc sanitizer.

  • Die Zeile kommt von malloc, welches direkt danach kommt.

    Das kann mehrere Ursachen haben, malloc bemerkt und printet es nur. Aber dann ist das Kind wohl schon in's Wasser gefallen.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Hmm. Aus irgendeinem Grund gibt es Probleme mit Speicher für diesen thread: sowas wie new(), malloc(), delete(), free(), double free,...

    - die logischste Erklärung sind mehrere Prozesse(threads) die parallel lesend (oder noch schlimmer schreibend..) parallel auf Variablen zugreifen.

    - alternativ auch loops, die 'out-of-bounds' sind und danach Speicherbereiche überschreiben


    malloc() und free() stolpern dann erst später über die pösen Übeltäter, nur dann ist ja alles viel zu spät.

    Irgendwas mit mehreren threads, wie seahawk in #22 bereits vermutet hat.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Ich habe mir den VDR Log nochmal angeschaut: Was auffällt ist, das der Crash immer passiert, wenn im Hintergrund die PID's

    Code
    Feb 04 20:29:31 vnas2.home.arpa vdr[17711]: [17719] creating new channel 'BR Fernsehen Süd HD,;ARD' on S19.2E transponder 111582 with id 1-1025-10325-0
    Feb 04 20:29:31 vnas2.home.arpa vdr[17711]: [17719] creating new channel 'BR Fernsehen Nord HD,;ARD' on S19.2E transponder 111582 with id 1-1025-10326-0
    Feb 04 20:29:32 vnas2.home.arpa vdr[17711]: [17719] changing pids of channel 4189 (BR Fernsehen Süd HD) from 0+0=0:0:0:0 to 5201+5201=27:5202=deu@3,5203=mis@3,5207=qks@3;5206=deu@106:520>
    Feb 04 20:29:32 vnas2.home.arpa vdr[17711]: [17760] VNSI: Requesting clients to reload channels list
    Feb 04 20:29:32 vnas2.home.arpa runvdr.extreme[17711]: malloc(): unaligned tcache chunk detected
    Feb 04 20:29:35 vnas2.home.arpa runvdr.extreme[11144]: /usr/bin/runvdr.extreme: Zeile 887: 17711 Abgebrochen             (Speicherabzug geschrieben) "${VDRCOMMAND[@]}"
    Feb 04 20:29:35 vnas2.home.arpa runvdr.extreme[11144]: Restarting VDR and DVB by error level 134 at

    eines Kanals geändert werden, hier scheint der vdr Thread mit vnsiserver sich in Gehege zu kommen. Vielleicht ein Hinweis?

  • Das ist jetzt wirklich nur ein Schuss ins Blaue, aber kannst du bei einer 2.6.6 mal den Commit rückgängig machen?

    http://git.tvdr.de/?p=vdr.git;a=c…649db55ae705467

    Sind bei 2.6.5 auch die Warnings weg? Dann sollte man das relativ easy bisecten können. Muss ich nur mal schauen ob ich beim Kompilieren auch diese Warnings bekomme.

    Unabhängig davon spinne ich bereits an einer vermutlich etwas blöden Idee. Mal sehen ob ich mal Zeit und Geduld dafür finde. Je länger ich mir die PVR-API von Kodi anschaue um so mehr sehe ich da Parallelen zu SVDRP. Allerdings wird es hier und da noch hapern. Mit starkem Performance-Nachteil würde es vermutlich jetzt schon gehen aber ich brauche für LSTE zum Beispiel eine Option um EPG-Events zwischen zwei Zeitstempeln zu erhalten. Bevor ich da Zeit reinstecke würde ich dann kls nochmal anmailen. Patches kann ich ggf. liefern.

    Weil der VDR selbst noch keine Video-Streams unterstützt muss ich das erstmal versuchen auf stremdev aufzusetzen. Faktisch ist das genau so tot wie VNSI aber man muss nehmen was man kriegt. Setzt voraus das Streamdev sowohl Live-TV als auch Aufnahmen via HTTP streamt und das man von den Daten aus SVDRP auch auf die entsprechenden Streams schließen kann (also LSTR eine Art Index mitliefert mit der man den zugehörigen Stream erhält).

  • Hab den Commit einmal aus vdr-2.6.6 herausgenommen. Kein Crash bisher zwei h lauf und dann heftiges Umschalten auf

    Kanälen, welche selten benutzt werden und daher die PID's aktualisiert werden. Dies führte bisher häufig zu crashs

    Die Compile Warnings gib es in 2.6.5 u. 2.6.6

    Ich werd es weiter beobachten.

    PS: Diese Diskussion taucht bei mir nur nach login ins Webportal auf gibt es eventuell ein Rechte Problem?

  • Hi,

    Der Patch für http://git.tvdr.de/?p=vdr.git;a=c…649db55ae705467 kommt von mir.

    Es wird der move constructor und move assignment operator für cString implementiert, siehe https://en.cppreference.com/w/cpp/language/move_constructor .

    Sehr überschaubare Änderungen, falls da ein Fehler drin sein sollte, müsste man das doch durch ein Code Review herausfinden können.

    Falls es wirklich an diesem commit liegt, würde ich sagen, da ist ein bug in vnsiserver, der nur zu Tage tritt, wenn der move constructor / move assignment operator für cString implementiert ist.

    ~ Markus

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Anscheinend triggert cChannel::Name() das.

    channels.c Zeile 114

    nameSource = cString::sprintf("%s (%s)", name, *cSource::ToString(source));

    Dann wird in cString::sprintf vasprintf aufgerufen und es knallt.


    Die Zeile ist nur aktiv, wenn Setup.ShowChannelNamesWithSource gleich 2 ist.

    Im Menü entspricht das wohl "Show channel names with source" = "full"

    Wäre interessant, welcher Wert der Einstellung aktiv ist und was passiert, wenn der commit wieder drin ist, aber die Einstellung auf off oder type steht.

    So wie es ausschaut steckt der Fehler in vdr, nicht im Plugin.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!