vdr beendet bei Strg-C nicht richtig - wie debuggen?

  • 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?

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • Hi'


    ich nehme an "gdb" bringt Dich nicht weiter, oder?


    Gruss


    Macaviy

    Capulet:
    HW: Dell Dimension 3100, Pentium 4 3GHz, 2GB RAM, 160GB HDD (System), 1TB HDD (Video), 1 x TT S2-1600, 1 x Technisat Skystar HD | SW: Debian 7.4, VDR 2.0.4 (selfcompiled), dummydevice 2.0.0, streamdev-server 0.6.1, NFS-Server


    TiViPi01:
    HW: Raspberry Pi Mod. B Rev. 2, 512MB RAM, 8GB SD-Card, Teko TEK-BERRY.9 Gehäuse, Ednet 85024 USB 2.0 Hub, Digitainer X10 Funk-Fernbedienung | SW: Raspbian 01/2014, VDR 2.0.4 (selfcompiled), rpihddevice 0.0.8, ffmpeg 1.0.8, streamdev-client 0.6.1, NFS-Client

  • 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

    VDR: Thermaltake DH102, Asus M3N78-PRO AMD 4850e, GT 220 passiv, 1x Mystique SaTiX-S2 Dual

  • 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


    Code
    cCondWait::~cCondWait()
    {
      pthread_cond_broadcast(&cond); // wake up any sleepers
      pthread_cond_destroy(&cond); //Zeile 53
      pthread_mutex_destroy(&mutex);
    }


    Code
    cRingBuffer::~cRingBuffer() //Zeile 39
    {
      delete ioThrottle;
      if (statistics)
         dsyslog("buffer stats: %d (%d%%) used", maxFill, maxFill * 100 / (size - 1));
    }



    Code
    cRingBufferLinear::~cRingBufferLinear()
    {
    #ifdef DEBUGRINGBUFFERS
      DelDebugRBL(this);
    #endif
      free(buffer);
      free(description);
    } //Zeile 204



    Code
    void 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...

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    Einmal editiert, zuletzt von Dr. Seltsam ()

  • 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!