Ich hab hier das Problem, dass vdr in Kombination mit bestimmten Plugins auf der Konsole beim Strg-C einfach nicht richtig beendet. Es scheint irgendwo zu hängen. Hat jemand eine Idee, wie man sowas debuggen kann, solange es keinen segfault gibt?
vdr beendet bei Strg-C nicht richtig - wie debuggen?
-
-
Hi'
ich nehme an "gdb" bringt Dich nicht weiter, oder?
Gruss
Macaviy
-
Hallo,
aber nicht im gdb starten. Ctrl-C wird vom gdb abgefangen. Also erst wenn's hängt mit gdb --pid=<vdr-Pid> 'dranhängen. Dann sollte man sehen, in welchem Thread es wo hängt.Viele Grüße
Dominik
Gesendet von meinem iPad mit Tapatalk HD
-
Hallo,
aber nicht im gdb starten. Ctrl-C wird vom gdb abgefangen. Also erst wenn's hängt mit gdb --pid=<vdr-Pid> 'dranhängen. Dann sollte man sehen, in welchem Thread es wo hängt.vielen Dank, wieder was dazugelernt!
Code#0 0x00007fbf6dd99b59 in pthread_cond_destroy@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0 #1 0x000000000050a0f5 in cCondWait::~cCondWait (this=0xb1aec8, __in_chrg=<optimized out>) at thread.c:53 #2 0x00000000004e3241 in cRingBuffer::~cRingBuffer (this=0xb1ae60, __in_chrg=<optimized out>) at ringbuffer.c:39 #3 0x00000000004e3319 in cRingBufferLinear::~cRingBufferLinear (this=0xb1ae60, __in_chrg=<optimized out>) at ringbuffer.c:204 #4 0x00007fbf64f5c5cb in cIptvDevice::~cIptvDevice (this=0xb12e90, __in_chrg=<optimized out>) at device.c:67 #5 0x00007fbf64f5c759 in cIptvDevice::~cIptvDevice (this=0xb12e90, __in_chrg=<optimized out>) at device.c:79 #6 0x000000000048253e in cDevice::Shutdown () at device.c:380 #7 0x000000000046bfb0 in main (argc=<optimized out>, argv=<optimized out>) at vdr.c:1411
Fürs Protokoll: Das Beenden von vdr + softhddevice + iptv + osdtelext hängt, wenn der letzte laufende Sender von iptv kam
CodecCondWait::~cCondWait() { pthread_cond_broadcast(&cond); // wake up any sleepers pthread_cond_destroy(&cond); //Zeile 53 pthread_mutex_destroy(&mutex); }
CodecRingBuffer::~cRingBuffer() //Zeile 39 { delete ioThrottle; if (statistics) dsyslog("buffer stats: %d (%d%%) used", maxFill, maxFill * 100 / (size - 1)); }
CodecRingBufferLinear::~cRingBufferLinear() { #ifdef DEBUGRINGBUFFERS DelDebugRBL(this); #endif free(buffer); free(description); } //Zeile 204
Code
Alles anzeigencIptvDevice::~cIptvDevice() { debug("cIptvDevice::%s(%d)", __FUNCTION__, deviceIndexM); DELETE_POINTER(pIptvStreamerM); DELETE_POINTER(pUdpProtocolM); DELETE_POINTER(pCurlProtocolM); DELETE_POINTER(pHttpProtocolM); DELETE_POINTER(pFileProtocolM); DELETE_POINTER(pExtProtocolM); DELETE_POINTER(tsBufferM); //Zeile 67 DELETE_POINTER(pPidScannerM); DELETE_POINTER(pSidScannerM); // Stop section handler of iptv device StopSectionHandler(); DELETE_POINTER(pIptvSectionM); // Close dvr fifo if (dvrFdM >= 0) { int fd = dvrFdM; dvrFdM = -1; close(fd); } } //Zeile 79
Codevoid cDevice::Shutdown(void) { deviceHooks.Clear(); for (int i = 0; i < numDevices; i++) { delete device[i]; //Zeile 380 device[i] = NULL; } }
Zeile 1411 in vdr.c ist der Aufruf von cDevice:: Shutdown();
Es hängt also beim Beenden des ringbuffers. Die Methode im iptv-Plugin dazu ist gar nicht mal so dumm und wird so auch in pvrinput praktiziert.
Code#define DELETE_POINTER(ptr) \ do { \ if (ptr) { \ typeof(*ptr) *tmp = ptr; \ ptr = NULL; \ delete(tmp); \ } \ } while (0)
Die Idee hierbei ist, dass man bevor man den Thread löscht, den Pointer erst auf dem lokalen Stack in einer *_tmp Variable sichert, dann den eigentlichen Pointer mit NULL versieht (was alle Abfragen auf diesen Pointer mit false als Ergebnis zurück liefern lässt) und dann erst den eigentlichen Thread durch den delete Aufruf löscht.
Na mal schauen, vielleicht fällt mir beim Vergleich mit pvrinput noch etwas ein...
-
Da ein cCondWait involviert ist, sieht das auf den ersten Blick nach einem Deadlock aus. Man müsste mal herausfinden, wer da wohl alles einen Lock hält.
Hab jetzt aber nicht weiter in den Code geschaut.
Lars.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!