Hallo kamel5,
ich habe hier folgenden segfault:
Display Spoiler
(gdb) bt full
#0 cEvent::Description (this=0x0)
at /home/andreas/git/VDRSternELEC/LibreELEC.tv/build.LibreELEC-RK3399.arm-12.0-devel/toolchain/armv8a-libreelec-linux-gnueabihf/sysroot/usr/local/include/vdr/epg.h:107
No locals.
#1 cDrawDescription::Draw (this=this@entry=0x116dc58) at displaymenu.c:1818
Event = 0x0
Timer = 0xe4b00fa8
Recording = 0x0
Info = 0x0
titel = <optimized out>
shortText = <optimized out>
s = <optimized out>
font = <optimized out>
parentalRating = {_vptr.cString = 0x360, s = 0x381 <error: Cannot access memory at address 0x381>}
textColorBg = <optimized out>
x0 = <optimized out>
x1 = <optimized out>
y0 = <optimized out>
y1 = <optimized out>
rand = <optimized out>
textwidth = <optimized out>
x00 = <optimized out>
y00 = <optimized out>
w = <optimized out>
space = <optimized out>
l0 = 78
height = <optimized out>
lines = 1011
l1 = <optimized out>
pixmapwidth = <optimized out>
pixmapHeigh = <optimized out>
#2 0xf518b414 in cDrawDescription::Action (this=0x116dc58) at displaymenu.c:1924
fadeinDelay = <optimized out>
scrollDelay = <optimized out>
maxY = <optimized out>
drawPortY = <optimized out>
FrameTime = <optimized out>
doSleep = <optimized out>
#3 0x001341a8 in cThread::StartThread (Thread=0x116dc58) at thread.c:293
No locals.
#4 0xf74ce810 in ?? () from /usr/lib/libc.so.6
No symbol table info available.
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)
Display More
Taucht auf mit folgendem Szenario auf:
- skinlcarsng.DispInfoMenuTimer ist gesetzt
- Die Timer werden auf dem Server gesetzt
- Das Event ist zwar in der epg.data des Servers enthalten, fehlt allerdings in der epg.data auf dem Client, da der Client die epg.data über streamdev "nachzieht"
- Wenn ich die epg.data vom Server auf den Client kopiere, passt es.
Schnelle Lösung:
diff --git a/displaymenu.c b/displaymenu.c
index 3839410..0c347c1 100644
--- a/displaymenu.c
+++ b/displaymenu.c
@@ -1815,7 +1815,7 @@ void cDrawDescription::Draw(void)
} else if (aI.Timer) {
Timer = aI.Timer;
Event = Timer->Event();
- if (!Event->Description())
+ if (!Event || !Event->Description())
return;
} else
return;
Display More
oder die events aus der epg.data des Systems lesen, von der auch die timers.conf stammt. Ich weiß aber nicht, ob man da ans client-server handling von VDR selbst ran müsste.
Die Abfrage gegen !Event wäre imho immer sinnvoll, da die epg.data ja zwischendurch auch mal bereinigt werden kann und die timers.conf bleibt trotzdem...
Gruß
Andreas