Kann mal bitte jemand auflisten welche Patches aktuell sind? Dann würde ich die gegen Abend in einem neuen Branch mal einbauen.
Compile Warnings in vnsiserver
-
-
SHF: Genau die gleiche Idee. Die macros machen auch nicht viel anderes.
Wollen wir mit deinem oder meinem Patch weitermachen?
Mir egal, Hauptsache gleicher Code und es ist absolut sicher, dass der Lock aus dem Spiel ist.
@Zeilennummern, ich nutze einen online c++ demangler zur Lesbarkeit und hangele mich dann Zeile für Zeile durch den code, beginnend ab der ersten im Core. Setzt voraus, dass man *genau* den code hat, vdr und plugin.
-
Hab vnsiserver mit Patch aus #101:
crash um 23:19:27 Syslog:
Code
Alles anzeigenFeb 20 23:19:27 vnas2.home.arpa vdr[4033]: [11543] VNSI: activate live receiver: 1 Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [11543] VNSI: Successfully switched to channel 2 - ZDF HD (S19.2E) Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [11543] VNSI: Started streaming of channel ZDF HD (S19.2E) (timeout 14 seconds) Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [11546] cLiveStreamer stream processor thread started (pid=4033, tid=11546, prio=high) Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [4063] loading /etc/vdr/plugins/vnsiserver/allowed_hosts.conf Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [4063] VNSI: Client with ID 15 connected: 192.168.20.117:43470 Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [11547] VNSI Socket 41 thread started (pid=4033, tid=11547, prio=high) Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [11548] VNSI Client 15->192.168.20.117:43470 thread started (pid=4033, tid=11548, prio=high) Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [11548] VNSI: Welcome client 'XBMC Media Center' with protocol version '13' Feb 20 23:19:27 vnas2.home.arpa vdr[4033]: [4084] VNSI: Requesting clients to reload channels list Feb 20 23:19:30 vnas2.home.arpa vdr[11574]: [11574] VDR version 2.6.6 started Feb 20 23:19:30 vnas2.home.arpa vdr[11574]: [11574] switched to user 'vdr' Feb 20 23:19:30 vnas2.home.arpa vdr[11574]: [11574] codeset is 'UTF-8' - known
Im Anhang der dazugehörige Coredump.
-
Vielleicht sind es cString::sprintf() und cString::vsprintf(), die nicht threadsafe sind.
Zu vasprintf() gibt es Hinweise, dass die Funktion nur dann threadsafe ist, wenn sich die locale nie ändert.
-
VDR setzt die c-locale am Anfang. 'setlocale(LC_ALL, "")'.
VDR ändert die dann nicht mehr.
Ihr könnt ja mal mit grep nach setlocale im vnsiserver suchen.
~ Markus
P.S.: Ich denke, die c++ locale ist hier irrelevant (?)
-
Genau die gleiche Idee. Die macros machen auch nicht viel anderes.
Inzwischen habe ich da etwas mehr Überblick und im Endeffekt sollten alle 3 Varianten in diesem Fall aufs selbe hinaus laufen.
Wollen wir mit deinem oder meinem Patch weitermachen?
Mir egal, Hauptsache gleicher Code und es ist absolut sicher, dass der Lock aus dem Spiel ist.
Mir auch völlig egal.
Ich hatte es eigentlich nur angehängt, da ich es eh rum fliegen hatte.
Soll doch der Maintainer entscheiden, was er für besser zu pflegen hält.
Inzwischen bin ich aber relativ sicher, dass der Lock nicht die Ursache für den Crash ist, sonder den ganzen Prozess nur in Gang setzt.
Bislang hatte ich vermutet, dass der Neustart das Einlesen der Kanalliste auslöst, das scheint aber nicht so zu sein.
Das zwei Prozesse gleichzeitig einen Readlock auf die Kanalliste bekommen, müsste prinzipiell auch funktionieren. Und die Formulierungen deuten für mich auch darauf hin, dass mehrere Prozesse gleichzeitig einen Readlock auf eine Liste haben können.
Der Ablauf müsste folgender sein:
Der VDR ändert die PID eines Kanals und gibt die Kanalliste wieder frei. Dabei wird der Statekey auch korrekt inkrementiert.
Das merkt jetzt das vnsiplugin und gibt das an die KODIClients weiter. Der Code dazu steckt in status.c, die ganze Datei dient nur dazu die Listen des VDR auf Änderungen zu überwachen.
Die Clients holen sich dann jeweils die neue Kanalliste vom Plugin. Und das startet dann processCHANNELS_GetChannels, ehe die Daten an die Clients geschickt werden.
Einen Einfluss des Neustarts kann ich momentan zwar nicht 100% ausschließen, aber da das Problem auch zur Laufzeit auftritt, lasse ich das hier mal gut sein.
Zum Zeitpunkt der Crashs laufen eigentlich auch nur die beiden for-Schleifen in processCHANNELS_GetChannels. Praktisch alle anderen Prozesse stehen bei einem "wait" oder "poll" das heisst, die tun eigentlich nichts und warten nur.
Der Fehler müsste IMHO also in irgend einem Code-Schnipsel liegen, der in der for-Schleife ausgeführt wird.
crash um 23:19:27
Da hat es mal nicht den Prozess, der in channel->Name() steckt erwischt. (Womit sich meine Frage nach der Zeilennummer erübrigt.)
Vielleicht sind es cString::sprintf() und cString::vsprintf(), die nicht threadsafe sind.
Das will ich mal nicht hoffen, das würde eine Katastrophe nahe kommen .
Aber evtl. ein Bug in der GLIBC?
@Zeilennummern
Danke für den Tipp, das schaue ich mir mal an.
-
Ihr könnt ja mal mit grep nach setlocale im vnsiserver suchen.
Weder setlocale noch locale gibt es.
Vielleicht sind es cString::sprintf() und cString::vsprintf(), die nicht threadsafe sind.
Nach einigem nachdenken habe ich aber keinen kritischen Fall gesehen (was aber nicht heissen muss).
Auf der Kanalliste ist der Readlock, die sollte sich nicht ändern, solange diese for-Schleife läuft.
Und sonst wird nichts mit anderen Threads ausgetauscht - zumindest nicht offensichtlich.
Ich habe aber mal grob überschlagen, dass bei einem Durchlauf der for-Schleife cString::sprintf() oder ein Äquivalent zwischen 10 und 20 Mal aufgerufen werden. Praktisch jeder ausgeführte Befehl mach mindestens einen Aufruf, manche gleich mehrere.
Es könnte auch gut eine Frage der Statistik sein, dass es meist cString::sprintf() trifft.
Dann verwenden noch die Funktionen von cResponsePacket dynamische Speicherverwaltung. Eine üble Rechnerei mit Puffergrösse, verbrauchtem Puffer usw.
Gesehen hab ich zwar nichts auffälliges, aber würde mich nicht wundern, wenn man sich da irgendwo +-1 verrechnet hat.
Da muss ich morgen noch mal ausgeschlafen genauer schauen .
Einiges, was in der Schleife gemacht wird ist IMHO für den Betrieb nicht lebensnotwendig.
Wenn man Lust hat, könnte man mal versuchen möglichst viel zu deaktivieren, um die Suche einzugrenzen:
C++: vnsiclient.c
Alles anzeigen// if (radio != cVNSIChannelFilter::IsRadio(channel)) // continue; //filtert Radiokanäle aus der Liste raus, eigentlich nicht unbedingt nötig // skip invalid channels // if (channel->Sid() == 0) // continue; // notwendig? gibt evtl. Probleme ohne. // if (endswith(channel->Name(), "OBSOLETE")) // continue; //filtert Kanäle mit "OBSOLETE" am Ende raus, sollte auch so gehen // check filter // if (filter && !VNSIChannelFilter.PassFilter(*channel)) // continue; //Favoritenliste, schätze ich. Müsste auch ohne gehen. //den nächsten Block braucht man, sonst kommt nichts bei den Clients an ;-) uint32_t uuid = CreateChannelUID(channel); resp.add_U32(channel->Number()); resp.add_String(m_toUTF8.Convert(channel->Name())); resp.add_String(m_toUTF8.Convert(channel->Provider())); resp.add_U32(uuid); resp.add_U32(channel->Ca(0)); caid_idx = 0; caids = "caids:"; while((caid = channel->Ca(caid_idx)) != 0) { caids = cString::sprintf("%s%d;", (const char*)caids, caid); caid_idx++; } resp.add_String((const char*)caids); if (m_protocolVersion >= 6) { resp.add_String(CreatePiconRef(channel)); } // create entry in EPG map on first query // m_epgUpdate.insert(std::make_pair(uuid, sEpgUpdate())); // Ist wohl nötig, damit man EPG zu dem Kanal bekommt. Geht auch erstmal ohne.
Wahrscheinlich wird es bei einem oder mehreren der 4 makierten Blöcke irgendwelche Probleme geben.
Da muss man Probieren, was unbedingt gebraucht wird und was nicht.
-
Hi,
Bin kein Programmierer, aber versucht doch einfach mal statt readlock zum Ursache finden die Channels zu duplizieren so dass jeder Thread seine eigene Kopie hat. Dann kann es ja keine doppelten Zugriffe mehr geben. Ist nur zum Fehler ausschließen, nicht für später.
Nur als Idee.
MfG Stefan
-
Wie gesagt es gibt auch nach den Patchen bei mir immer noch diese Compiler Warnung:
Code
Alles anzeigeng++ -g -O1 -Wall -march=goldmont-plus -Woverloaded-virtual -Wno-parentheses -fPIC -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -std=c++11 -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"vnsiserver"' -DVNSI_SERVER_VERSION='"1.8.3"' -I/usr/src/packages/BUILD/vdr-2.6.6-test/include -o vnsisocket.o vnsisocket.c In file included from /usr/include/c++/13/bits/shared_ptr_atomic.h:33, from /usr/include/c++/13/memory:81, from videoinput.h:27, from videoinput.c:27: In member function ‘std::__atomic_base<_IntTp>::__int_type std::__atomic_base<_IntTp>::load(std::memory_order) const [with _ITp = bool]’, inlined from ‘std::atomic<bool>::operator bool() const’ at /usr/include/c++/13/atomic:87:26, inlined from ‘bool cDummyReceiver::BeenDetached()’ at videoinput.c:428:32, inlined from ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’ at videoinput.c:469:28: /usr/include/c++/13/bits/atomic_base.h:505:31: warning: ‘unsigned char __atomic_load_1(const volatile void*, int)’ writing 1 byte into a region of size 0 overflows the destination [-Wstringop-overflow=] 505 | return __atomic_load_n(&_M_i, int(__m)); | ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ In static member function ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’: cc1plus: note: destination object is likely at address zero
writing 1 byte into .... und cc1plus : dest... is likely at address zero.
geben diese compiler Warnungen nicht Hinweise auf das Fehlverhalten?
----------------------------------------------
Im Anhang der coredump von 20240221-221117
Code
Alles anzeigenFeb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11301] VNSI Client 3->192.168.20.171:53426 thread started (pid=11224, tid=11301, prio=high) Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11301] VNSI: Welcome client 'XBMC Media Center' with protocol version '13' Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11229] SATIP: Detected 1 RTP packet error [device 0] Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Created stream for pid=5101 and type=8 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Created stream for pid=5106 and type=1 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Created stream for pid=5102 and type=2 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Created stream for pid=5103 and type=2 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Created stream for pid=5107 and type=2 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Created stream for pid=5105 and type=10 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Created stream for pid=5104 and type=12 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Audio stream change, pid: 5102, channels: 2, samplerate: 48000 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Audio stream change, pid: 5103, channels: 2, samplerate: 48000 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Audio stream change, pid: 5106, channels: 2, samplerate: 48000 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Audio stream change, pid: 5107, channels: 2, samplerate: 48000 Feb 21 22:11:10 vnas2.home.arpa vdr[11224]: [11299] VNSI: Video stream change, pid: 5101, width: 1280, height: 720, aspect: 1,777778 Feb 21 22:11:13 vnas2.home.arpa vdr[11224]: [11233] changing pids of channel 4269 (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=qks@3;5126=deu@106:5135=deu:5134 Feb 21 22:11:14 vnas2.home.arpa vdr[11224]: [11273] VNSI: Requesting clients to reload channels list Feb 21 22:11:17 vnas2.home.arpa vdr[11330]: [11330] VDR version 2.6.6 started Feb 21 22:11:17 vnas2.home.arpa vdr[11330]: [11330] switched to user 'vdr'
Neue Coredumps gerne auf Anforderung.
-
Dass bei dir noch die Warnung auftritt, aber bei den anderen nicht, habe ich nicht verstanden.
Aber die Warnung ist nur ein weiteres Problem.
Und es knallt wieder in cString::sprintf() bei vasprintf
-
#1 0x00007f9fe0041176 __GI_raise (libc.so.6 + 0x41176)
#2 0x00007f9fe0028917 __GI_abort (libc.so.6 + 0x28917)
heißt aber AFAIK, dass das geplant aborted wurde, also dass ggf. das kaputt ist, was in den vasprintf gesteckt wurde.
-
Zitat
Dass bei dir noch die Warnung auftritt, aber bei den anderen nicht, habe ich nicht verstanden.
Aber die Warnung ist nur ein weiteres Problem.
ich hab jetzt mal mit -O0 übersetzt, dann gibt es bei mir auch keine warnings ebenso keine mit-Wno-stringop-overflow
. Es crasht dennoch:wenn es interessant ist hier der coredump mit -O0
Code
Alles anzeigenFeb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32155] VNSI Client 9->192.168.20.171:49386 thread started (pid=31305, tid=32155, prio=high) Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32155] VNSI: Welcome client 'XBMC Media Center' with protocol version '13' Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32153] VNSI: Created stream for pid=5101 and type=8 Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32153] VNSI: Created stream for pid=5106 and type=1 Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32153] VNSI: Created stream for pid=5102 and type=2 Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32153] VNSI: Created stream for pid=5103 and type=2 Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32153] VNSI: Created stream for pid=5107 and type=2 Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32153] VNSI: Created stream for pid=5105 and type=10 Feb 22 19:59:27 vnas2.home.arpa vdr[31305]: [32153] VNSI: Created stream for pid=5104 and type=12 Feb 22 19:59:28 vnas2.home.arpa vdr[31305]: [32153] VNSI: Audio stream change, pid: 5102, channels: 2, samplerate: 48000 Feb 22 19:59:28 vnas2.home.arpa vdr[31305]: [32153] VNSI: Audio stream change, pid: 5103, channels: 2, samplerate: 48000 Feb 22 19:59:28 vnas2.home.arpa vdr[31305]: [32153] VNSI: Audio stream change, pid: 5107, channels: 2, samplerate: 48000 Feb 22 19:59:28 vnas2.home.arpa vdr[31305]: [32153] VNSI: Audio stream change, pid: 5106, channels: 2, samplerate: 48000 Feb 22 19:59:28 vnas2.home.arpa vdr[31305]: [32153] VNSI: Video stream change, pid: 5101, width: 1280, height: 720, aspect: 1,777778 Feb 22 19:59:28 vnas2.home.arpa vdr[31305]: [31354] VNSI: Requesting clients to reload channels list Feb 22 19:59:31 vnas2.home.arpa vdr[32182]: [32182] VDR version 2.6.6 started Feb 22 19:59:31 vnas2.home.arpa vdr[32182]: [32182] switched to user 'vdr' Feb 22 19:59:31 vnas2.home.arpa vdr[32182]: [32182] codeset is 'UTF-8' - known
diesmal wie gesagt ohne compiler Optimierungen, vielleicht gibts es weitere Erkenntnisse.
-
#1 0x00007f9fe0041176 __GI_raise (libc.so.6 + 0x41176)
#2 0x00007f9fe0028917 __GI_abort (libc.so.6 + 0x28917)
heißt aber AFAIK, dass das geplant aborted wurde, also dass ggf. das kaputt ist, was in den vasprintf gesteckt wurde.
in vasprintf wird malloc aufgerufen, soll ja ein neuer const char* zurück gegeben werden. malloc versucht sich ein neues Häppchen Speicher aus dem tcache zu holen (sind ja nur wenige bytes), aber stolpert dabei und printet einen Fehler + ruft wohl abort() aus stdlib.h auf.
-
Bin kein Programmierer, aber versucht doch einfach mal statt readlock zum Ursache finden die Channels zu duplizieren so dass jeder Thread seine eigene Kopie hat. Dann kann es ja keine doppelten Zugriffe mehr geben. Ist nur zum Fehler ausschließen, nicht für später.
Die Kanalliste "gehört" dem VDR, um die lesen zu dürfen muss man sich einen readlock holen, sonst ist Chaos vorprogrammiert.
Da sowohl die originale Variante, als auch die wirbel, als auch meine, das exakt gleich Verhalten zeigen, wird es am readlock selber wohl eher nicht liegen.
Man könnte testweise den VDR so modifizieren, dass nur ein Thread readlock auf die Channels gewährt bekommt, das müsste vergleichbar einfach machbar sein.
So würde dann nur noch einer der VNSI-Plugin-Threads gleichzeitig laufen.
Die Änderung würde einiges durcheinander werfen, was das gesamte Timing im VDR betrifft. Unter Umständen geht damit dann gar nichts mehr.
[...] (war doppelt)
writing 1 byte into .... und cc1plus : dest... is likely at address zero.
geben diese compiler Warnungen nicht Hinweise auf das Fehlverhalten?Leider nicht.
Das ist auch an einer völlig anderen Stelle, der Code wird hier gar nicht verwendet.
ich hab jetzt mal mit -O0 übersetzt, dann gibt es bei mir auch keine warnings ebenso keine mit
-Wno-stringop-overflow
. Es crasht dennoch:Dass es mit der Optimierung zu tun hat, habe ich schon öfters gelesen.
Vermutlich liegt es am am inlinen, das dürfte -O0 nicht machen.
Die Warnung ist aber generell wohl fehlerhaft, wenn man den GCC-Entwicklern trauen kann.
(Siehe Link in #69.) Die sind sich da auch einig, dass man die Warnung entfernen will.
Kann also gut sein, dass man das inzwischen gemacht hat und Warnung ab GCC Version 12.5 oder 12.6 verschwunden ist.
Generell ist dieses Konstrukt aber eher speziell (leerer Constructor dafür eine Initialisierungsliste), einen auffälligen Fehler sehe ich aber nicht.
Man könnte mal versuchen die Reihenfolge in der Initialisierungsliste zu tauschen, vielleicht bringt das was.
Patch im Anhang.(Entfernt, da es nicht funktioniert hat!)#1 0x00007f9fe0041176 __GI_raise (libc.so.6 + 0x41176)
#2 0x00007f9fe0028917 __GI_abort (libc.so.6 + 0x28917)
heißt aber AFAIK, dass das geplant aborted wurde, also dass ggf. das kaputt ist, was in den vasprintf gesteckt wurde.Prinzipiell richtig, nur kommen die Meldung vom *alloc() nicht vasprintf(), wie wirbel auch schon geschrieben hat.
Der Beitrag hat mich veranlasst mir endlich mal malloc() näher anzusehen, das hätte ich früher tun sollen...
Die Fehlermeldung malloc(): unaligned tcache chunk detected kommt von hier: malloc.c:3183
Wie man unschwer sieht, kommt die, wenn mit dem Zeiger auf den Speicherbereich etwas nicht stimmt.
Nach dem "Durchklicken" einiger der Links, sieht es mir so aus, als ob das beim anfordern eines neuen Speicherblocks passiert und die Safe-Linking Pointer Protection anschlägt.
100% sicher bin ich da zwar nicht, die Ursache müsste aber immer sein, dass jemand ausserhalb seines angeforderten Speichers etwas geschrieben hat.
Der Tcache enthält kürzlich freigegebene Blöcke und ist Thread bezogen, jeder hat seinen eigenen.
Ob man daraus aber schlussfolgern kann, dass der Übeltäter im gleichen Thread sitzt, bin ich nicht sicher.
Wenn man nach "tcache" sucht findet man, dass es auch Attacken darauf gibt.
Ich denke, unser Fehler besteht schon lange, fällt aber erst jetzt durch eine neu eingeführte Abwehrmaßnahme auf.
Primär verdächtig ist alles was mit dynamischer Speicherverwaltung (malloc() und Co.) zu tun hat.
Die Funktionen von cResponsePacket machen das dauernd.
Ich habe da mal etwas Puffer eingebaut und hole den Speicher in größeren Blöcken. Das löst das Problem zwar nicht, sollte die Wahrscheinlichkeit für einen Crash aber senken.
Wenn es mit den Patch besser wird, weiß man also wenigstens, wo man suchen muss.
-
Die Patche lassen sich anwenden, ich erhalte aber dann folgenden compile ERROR:
Code
Alles anzeigeng++ -g -O3 -Wall -march=goldmont-plus -Woverloaded-virtual -Wno-parentheses -fPIC -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -std=c++11 -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"vnsiserver"' -DVNSI_SERVER_VERSION='"1.8.3"' -I/usr/src/packages/BUILD/vdr-2.6.6-test/include -o responsepacket.o responsepacket.c responsepacket.c: In member function ‘void cResponsePacket::checkExtend(uint32_t)’: responsepacket.c:260:26: error: expected primary-expression before ‘<’ token 260 | if (80 + bufUsed + by) < bufSize) | ^ make[1]: *** [Makefile:86: responsepacket.o] Error 1 make[1]: *** Waiting for unfinished jobs.... streamer.c: In constructor ‘cLiveStreamer::cLiveStreamer(int, bool, int, uint8_t, uint32_t)’: streamer.c:57:17: warning: member ‘cLiveStreamer::m_Event’ is used uninitialized [-Wuninitialized] 57 | , m_VideoInput(m_Event) | ^~~~~~~ *** failed plugins: vnsiserver
-
-
nobanzai : Danke für den Hinweis.
Die Compilierung läuft jetzt durch. Aber es schweißt jetzt wieder mehr Warnungen.
Code
Alles anzeigeng++ -g -O3 -Wall -march=goldmont-plus -Woverloaded-virtual -Wno-parentheses -fPIC -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -std=c++11 -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"vnsiserver"' -DVNSI_SERVER_VERSION='"1.8.3"' -I/usr/src/packages/BUILD/vdr-2.6.6-test/include -o vnsitimer.o vnsitimer.c channelfilter.c: In member function ‘void cVNSIChannelFilter::StoreWhitelist(bool)’: channelfilter.c:188:23: warning: loop variable ‘i’ creates a copy from type ‘const cVNSIProvider’ [-Wrange-loop-construct] 188 | for (const auto i : *whitelist) | ^ channelfilter.c:188:23: note: use reference type to prevent copying 188 | for (const auto i : *whitelist) | ^ | & videoinput.c: In constructor ‘cDummyReceiver::cDummyReceiver()’: videoinput.c:439:21: warning: ‘cDummyReceiver::m_BeenDetached’ will be initialized after [-Wreorder] 439 | std::atomic<bool> m_BeenDetached; | ^~~~~~~~~~~~~~ videoinput.c:440:72: warning: base ‘cReceiver’ [-Wreorder] 440 | cDummyReceiver() : m_BeenDetached(false), cReceiver(NULL, MINPRIORITY) {} | ^ videoinput.c:440:3: warning: when initialized here [-Wreorder] 440 | cDummyReceiver() : m_BeenDetached(false), cReceiver(NULL, MINPRIORITY) {} | ^~~~~~~~~~~~~~ g++ -g -O3 -Wall -march=goldmont-plus -Woverloaded-virtual -Wno-parentheses -fPIC -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -std=c++11 -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"vnsiserver"' -DVNSI_SERVER_VERSION='"1.8.3"' -I/usr/src/packages/BUILD/vdr-2.6.6-test/include -o vnsisocket.o vnsisocket.c In file included from /usr/include/c++/13/bits/shared_ptr_atomic.h:33, from /usr/include/c++/13/memory:81, from videoinput.h:27, from videoinput.c:27: In member function ‘std::__atomic_base<_IntTp>::__int_type std::__atomic_base<_IntTp>::load(std::memory_order) const [with _ITp = bool]’, inlined from ‘std::atomic<bool>::operator bool() const’ at /usr/include/c++/13/atomic:87:26, inlined from ‘bool cDummyReceiver::BeenDetached()’ at videoinput.c:428:31, inlined from ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’ at videoinput.c:468:28: /usr/include/c++/13/bits/atomic_base.h:505:31: warning: ‘unsigned char __atomic_load_1(const volatile void*, int)’ writing 1 byte into a region of size 0 overflows the destination [-Wstringop-overflow=] 505 | return __atomic_load_n(&_M_i, int(__m)); | ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ g++ -g -O3 -Wall -march=goldmont-plus -Woverloaded-virtual -Wno-parentheses -fPIC -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -std=c++11 -c -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"vnsiserver"' -DVNSI_SERVER_VERSION='"1.8.3"' -I/usr/src/packages/BUILD/vdr-2.6.6-test/include -o StatusCommands.o StatusCommands.c In static member function ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’: cc1plus: note: destination object is likely at address zero In member function ‘std::__atomic_base<_IntTp>::__int_type std::__atomic_base<_IntTp>::load(std::memory_order) const [with _ITp = bool]’, inlined from ‘std::atomic<bool>::operator bool() const’ at /usr/include/c++/13/atomic:87:26, inlined from ‘bool cDummyReceiver::BeenDetached()’ at videoinput.c:428:31, inlined from ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’ at videoinput.c:468:28: /usr/include/c++/13/bits/atomic_base.h:505:31: warning: ‘unsigned char __atomic_load_1(const volatile void*, int)’ writing 1 byte into a region of size 0 overflows the destination [-Wstringop-overflow=] In static member function ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’: cc1plus: note: destination object is likely at address zero
Ich lass den Vdr jetzt laufen mal schauen ob es crashes gibt.
der VDR crasht jetzt sofort beim start:
Hier der backtrace:
Code
Alles anzeigen#0 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 #1 0x00007fe5c0494a73 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at pthread_kill.c:78 #2 0x00007fe5c0441176 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #3 0x00007fe5c0428917 in __GI_abort () at abort.c:79 #4 0x00007fe5c04297e8 in __libc_message_impl (fmt=fmt@entry=0x7fe5c05b3321 "%s\n") at ../sysdeps/posix/libc_fatal.c:132 #5 0x00007fe5c049f3c7 in malloc_printerr (str=str@entry=0x7fe5c05b6918 "malloc(): invalid size (unsorted)") at malloc.c:5772 #6 0x00007fe5c04a27fc in _int_malloc (av=av@entry=0x7fe570000030, bytes=bytes@entry=32816) at malloc.c:4078 #7 0x00007fe5c04a3a7d in __GI___libc_malloc (bytes=bytes@entry=32816) at malloc.c:3336 #8 0x00007fe5c04ddf15 in __alloc_dir (fd=fd@entry=34, close_fd=close_fd@entry=true, flags=flags@entry=0, statp=statp@entry=0x7fe590bffbb0) at ../sysdeps/unix/sysv/linux/opendir.c:115 #9 0x00007fe5c04ddf92 in opendir_tail (fd=34) at ../sysdeps/unix/sysv/linux/opendir.c:63 #10 0x00007fe5c04de596 in __scandir64 (dir=dir@entry=0x7fe570032c80 "/pool/vdr-video/Pacific_Rim", namelist=namelist@entry=0x7fe590bffd20, select=select@entry=0x0, cmp=0x7fe5c04de5be <__alphasort64>) at ../sysdeps/unix/sysv/linux/scandir64.c:27 #11 0x00007fe5c03b0106 in cVNSIClient::processRECORDINGS_GetList (this=0x7fe594000ef0, req=...) at vnsiclient.c:2280 #12 0x00007fe5c03b3cab in non-virtual thunk to cVNSIClient::visit(cRequestPacket&) () at /usr/src/packages/BUILD/vdr-plugin-vnsiserver-vdrprojects/vnsiclient.h:91 #13 0x00007fe5c03a9960 in cVNSIClient::Action (this=0x7fe594000ef0) at vnsiclient.c:103 #14 0x0000000000548952 in cThread::StartThread (Thread=0x7fe594000ef0) at thread.c:293 #15 0x00007fe5c0492bb2 in start_thread (arg=<optimized out>) at pthread_create.c:447 #16 0x00007fe5c051400c in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
-
Wenn ich irgendwie helfen kann, dann bitte melden. Ich sehe jetzt erstmal noch davon ab Patches ins Repo zu übernehmen. Ansonsten mache ich erstmal den stillen Zuschauer und verfolge die Gedankengänge derer, die sich mit C++ definitiv deutlich besser auskennen als ich.
-
Die Patche lassen sich anwenden, ich erhalte aber dann folgenden compile ERROR:
Beim responsepacket-Patch ist was durcheinander geraten, irgendwie hatte es die neueste Version nicht bis zum diff.txt geschafft.
Wenn man alles umbenennen muss, um es anzuhängen, muss das wohl mal passieren, sorry.
Ist jetzt oben aber korrigiert.
der VDR crasht jetzt sofort beim start:
Das ist eine Folge hier von:
Codevideoinput.c: In constructor ‘cDummyReceiver::cDummyReceiver()’: videoinput.c:439:21: warning: ‘cDummyReceiver::m_BeenDetached’ will be initialized after [-Wreorder] 439 | std::atomic<bool> m_BeenDetached; | ^~~~~~~~~~~~~~ videoinput.c:440:72: warning: base ‘cReceiver’ [-Wreorder] 440 | cDummyReceiver() : m_BeenDetached(false), cReceiver(NULL, MINPRIORITY) {} | ^ videoinput.c:440:3: warning: when initialized here [-Wreorder] 440 | cDummyReceiver() : m_BeenDetached(false), cReceiver(NULL, MINPRIORITY) {} | ^~~~~~~~~~~~~~
Und das ist eine Folge des "videoinput-Patches", den also bitte nicht mehr anwenden!
Ich hatte schon vermutet, dass man die Reihenfolge nicht einfach ungestraft ändern kann, bekam aber keine Warnung.
Irgendwie war bei mir das "-Wall" Flag verschwunden und ich habe es nicht gemerkt. Jetzt habe ich die Warnung aber auch.
Der Rest sind die bekannten Kandidaten, der Patch aus #81 fehlt vermutlich.
Den nächsten Versuch bitte mit dem Patch aus #81 und dem (neuen!) responsepacked-realloc3 aus #115.
Der aus #81 behebt die Warnungen und der aus #115 ist zum testen.
Der Rest der Patches hat ja nichts gebracht, belastet IMHO also nur.
Kann also gut sein, dass man das inzwischen gemacht hat und Warnung ab GCC Version 12.5 oder 12.6 verschwunden ist.
Kann doch nicht sein, Version 12.4 ist noch nicht draußen. Fix ist aber dafür vorgesehen.
Bei Version 13.2 kann es aber sein, da kann es zeitlich hin kommen.
Leider konnte ich aber nichts genaueres finden. Die Suche nach der Bug-Nummer im GIT brachte auch nichts.
-
Also mit dem neuen Patch responsepacket_realloc_3.diff.txt und dem Patch aus #81 erhalte ich auch mit der Compiler Option -O3 keine Warnung mehr. So weit sieht es also gut aus.
Wenn es wieder crashes gibt melde ich mich . Ein erster schneller Test zeigt kein crash bei den bisherigen Syslog Meldungen vor dem Absturz.
CodeFeb 25 10:40:56 vnas2.home.arpa vdr[431]: [1854] VNSI: Created stream for pid=33 and type=7 Feb 25 10:40:56 vnas2.home.arpa vdr[431]: [1854] VNSI: Created stream for pid=34 and type=2 Feb 25 10:40:56 vnas2.home.arpa vdr[431]: [1854] VNSI: Created stream for pid=36 and type=12 Feb 25 10:40:56 vnas2.home.arpa vdr[431]: [1854] VNSI: Audio stream change, pid: 34, channels: 2, samplerate: 48000 Feb 25 10:40:56 vnas2.home.arpa vdr[431]: [1854] VNSI: Video stream change, pid: 33, width: 720, height: 576, aspect: 1,777778 Feb 25 10:41:03 vnas2.home.arpa vdr[431]: [477] VNSI: Requesting clients to reload channels list
Vielen Dank für das Interesse an der Analyse dieses vertrackten Problems.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!