• Hallo

    das aktuelle xmltv4vdr crashed beim einlesen der epg Daten in den VDR:

    Program terminated with signal SIGSEGV, Segmentation fault.
    #0 0x0007635c in cChannel::Name() const ()
    [Current thread is 1 (Thread 0xcf2fb400 (LWP 6469))]
    (gdb)
    (gdb) bt
    #0 0x0007635c in cChannel::Name() const ()
    #1 0xeef2dd60 in GetChannelName(tChannelID) () from /usr/local/lib/vdr/libvdr-xmltv4vdr.so.8
    #2 0xeef31b9c in cXMLTVDB::AppendEvents(tChannelID, unsigned long long, int*, int*) ()
    from /usr/local/lib/vdr/libvdr-xmltv4vdr.so.8
    #3 0xeef2b6c8 in cEPGSources::Action() () from /usr/local/lib/vdr/libvdr-xmltv4vdr.so.8
    #4 0x00140eb0 in cThread::StartThread(cThread*) ()
    #5 0xf511c714 in ?? () from /usr/lib/libc.so.6
    Backtrace stopped: previous frame identical to this frame (corrupt stack?)

    Leider gibt der bt nicht mehr her. Das ganze läuft unter dem aktuellen VDR*Elec. Ich vermute ohne strip würde da mehr stehen.

  • Leider gibt der bt nicht mehr her

    Langt aber um den Fehler zu finden :)
    Offenbar steht in der xmltv4vdr.conf eine Channel ID für die es keinen Eintrag in der channels.conf gibt ...!? Kannst Du das bestätigen? Mit dem angehängten Patch sollte er nicht mehr crashen und sondern die ID im syslog anzeigen.
    Die Frage ist dann, ob man für solche Kanäle EPG importiert, die nicht (mehr) in der channels.conf stehen ? :/

  • Jetzt sieht der bt so aus:

    (gdb) bt full
    #0 cChannel::Name (this=0x0) at channels.c:127
    No locals.
    #1 0xef2e0d60 in GetChannelName (channelID=...) at database.cpp:1398
    Channels_Lock = {stateKey = {stateLock = 0x1bfef4 <cChannels::channels+16>, write = false, state = -1,
    timedOut = false}, list = 0x1bfee4 <cChannels::channels>}
    Channels = <optimized out>
    channel = <optimized out>
    #2 0xef2e4b9c in cXMLTVDB::AppendEvents (this=0xede0d0e0, this@entry=0xb, channelID=..., Flags=<optimized out>,
    totalSchedules=0xcf6fad60, totalSchedules@entry=0x0, totalEvents=0xcf6fad64, totalEvents@entry=0xcf6fad60)
    at database.cpp:1580
    success = true
    eventIDOffset = 0
    lastEvent = 0x0
    channelName = {_vptr.cString = 0xef1b4930 <sqlite3_free+112>, s = 0xc1300028 "ȡ", <incomplete sequence \357>}
    SchedulesStateKey = {stateLock = 0xcf6fac8c, write = 136, state = 258, timedOut = 45}
    Schedules = <optimized out>
    eventCache = <optimized out>
    stmt = 0xcf6fac88
    sqlSelect = {_vptr.cString = 0xc1319230, s = 0x0}
    SQLrc = <optimized out>
    __FUNCTION__ = "AppendEvents"
    lastEndTime = <optimized out>
    cnt = <optimized out>
    #3 0xef2de6c8 in cEPGSources::Action (this=<optimized out>) at maps.h:121
    channelID = {source = 1224736768, nid = 20, tid = 60, sid = 2, rid = 0}
    c = 0
    epgChannel = 0x19299d8
    epgChannelName = <optimized out>
    i = 0
    source = 0x196cc38
    epgChannelList = 0x196cca8
    s = 0
    totalSchedules = 0
    totalEvents = 0
    xmlTVDB = 0xb
    sourceList = {_vptr.cVector = <optimized out>, allocated = 1, size = <optimized out>,
    data = 0xef2fdb7c <XMLTVConfig>}
    epgsearch = {plugin = 0xede0d0e0}
    success = 4
    starttime = 1751707740
    timerStart = <optimized out>
    timer = {begin = 193371}

    Was mir noch aufgefallen ist:

    - Nach jedem neustart des VDR sind die Settings für xmltv4vdr wieder zurückgesetzt. Ich muss dann immer für die IPTV Kanäle das Setting wieder auf "nur ext. Events benutzen " setzen.

    - Ich habe 4 Kanäle eingerichtet und wenn nur einer aktiv ist dann läuft es durch. Bei zwei gibt es den crash.

  • Offenbar steht in der xmltv4vdr.conf eine Channel ID für die es keinen Eintrag in der channels.conf gibt ...!? Kannst Du das bestätigen?

    Leider kann ich das nicht bestätigen. Die 4 Kanäle die in der xmltv4vdr.conf stehen gibt es auch in der channels.conf.


    Ich versuch es dennoch mal mit deinem Pagtch. Dauert aber wohl noch etwas muss mit der Frau in den Biergarten :)

  • Ok hab den Patch nun doch mal eingebaut. Aber nun schleift der VDR beim versuch das epg einzulesen. Und das ist im Log zu finden:

    Jul 05 12:04:56 gabivdr vdr[5779]: [5819] xmltv4vdr: ERROR channel without name: I-20-60-2
    Jul 05 12:04:56 gabivdr vdr[5779]: [5819] xmltv4vdr: ERROR AppendEvents: Couldn't get or create schedule for 'unknown channel name'

    Den channel gibt es aber in der channels.conf. Das ist mein ORF2:

    ORF2;IPTV:610:S=1|P=1|F=EXTT|U=dashstream.sh|A=2:I:0:256=27:257=@4:0:0:1:20:60:0

    Edit:

    Hab grad gesehen das das ORF2 kaputt ist und in der channels.conf als I-20-60-1 steht. Habs nun geändert und nun läuft es auch durch.

    Ich hatte das aber alles über das OSD konfiguriert. Da wundere ich mich wie das zustande kommen konnte.

    Nun bleibt nur noch das Problem das die Konfig beim start des VDR kaputt geht,

    Edit2:

    Dein patch löst das Problem bei "verschwundenem" channel leider nicht sondern führt dazu das der VDR dann schleift. Da musst du nochmal nachdenken was du mit "verschwundenen" channels machst :)

    Edited 3 times, last by jojo61 (July 5, 2025 at 12:21 PM).

  • Da kann ich nicht ganz zustimmen. Der VDR hat schreibrechte auf die xmltv4vdr.conf. Ich habe es nun mal genauer angeschaut und die Konfig wird nicht beim start zurückgesetzt sondern beim ausführen einer aktualisierung. Ich hatte alle Channels auf "nur ext. Event nutzen" gesetzt. Dann hat der VDR die Updates so gemacht wie es in der Konfig definiert war und danach war die Konfig dann wieder kaputt.

    Vor den Updates:

    channel.orf-sport.at = orf_sport;0x1000FFFFC93F;I-40-80-4
    channel.orf1.at = orf1;0x1000FFFFC93F;I-10-50-1
    channel.orf2.at = orf2;0x1000FFFFC93F;I-20-60-2
    channel.orf3.at = orf3;0x1000FFFFC93F;I-30-70-3

    Nach den Updates:

    channel.orf-sport.at = orf_sport;0xFFFFFFFF;I-40-80-4
    channel.orf1.at = orf1;0xFFFFFFFF;I-10-50-1
    channel.orf2.at = orf2;0xFFFFFFFF;I-20-60-2
    channel.orf3.at = orf3;0xFFFFFFFF;I-30-70-3

    Das letzte Update lief um 21:00 und das ist auch die Zeit die die Konfig Datei nun hat. Nun sitzen die Channels wieder auf "EPG nur anreichern".

  • FireFly Wenn ich die kaputte Konfig repariere dann klappt es immer noch nicht. So wie es aussieht liesst er die Werte für "ext. EPG Events" nicht aus der Konfig ein.

    Nur wenn ich sie im laufenden VDR ändere (auf "nur ext. Events benutzen") werden sie beim Einlesen der XML Dateien auch richtig ausgewertet und das EPG erweitert.

    Danach werden sie dann in der Konfig beim schreiben der letzten aktualisierungszeit wieder kaputt geschrieben.

  • Du nutzt ein 32-Bit-System, oder? Denn die Flags sind nach dem Import nur noch 32 Bit lang anstatt 64.

    Welche Version genau nutzt Du? Da gabs nämlich mal ein Problem, das aber gefixed ist.

    Falls das ein 32-Bit-System ist kannst Du mal folgendes in maps.cpp probieren:

  • kannst Du mal folgendes in maps.cpp probieren

    MIt dieser Änderung scheint es nun zu funktionieren.

    Ich nutze VDR*Elec und da ist deine GIT Version drin. Das ganze läuft tatsächlich unter 32 Bit. An der Stelle in der Konfig ein Long zu nutzen ist wohl doch etwas ungeschickt. Statt long ist es besser int32_t oder int64_t in der definition zu nutzen. Das ist dann auch bei 32 Bit OS immer richtig.

    Danke für die schnelle Hilfe und das es nun klappt.

  • Statt long ist es besser int32_t oder int64_t in der definition zu nutzen

    Wo meinst Du das? flags ist ja überall ein uint64_t und ein strto_uint64() gibts ja nicht.

    und das es nun klappt.

    ... d.h. der Crash aus dem ersten Post ist damit auch weg? Oder durch den ersten Patch aus Post #3? Der behebt ja nicht das Problem sondern müsste eine Meldung im Syslog hinterlassen

  • d.h. der Crash aus dem ersten Post ist damit auch weg?

    Der crash ist weg weil ich die channels.conf angepasst habe. Damit gibt es keinen "fehlenden" channel mehr. Es crash also nach wie vor wenn ein channel fehlt. Dein patch verindert zwar den crash führt aber dazu das dann der VDR in einen busy loop kommt. Somit ist der Patch auch keine wirkliche Lösung.

    Der patch von maps.cpp ist erfolgreich auf meinem 32 Bit OS und die flags werden nun richtig verarbeitet. Ob das nun aber auf einem 64 Bit OS noch richtig ist kann ich leider nicht sagen.

    Ein strto_uint64 kannst du aber leicht bauen.

    Code
    strto_uint64(const char *s) {
      uint64_t i;
      char c ;
      int scanned = sscanf(s, "%" SCNd64 "%c", &i, &c);
      if (scanned == 1) return i;  
    }

Participate now!

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