debuggen: Kennt sich jemand mit GDB aus?

  • Ich habe eine Ausgabe von GDB erhalten, die einen segmentation fault beim Beenden von vdr im pvrinput-Plugin dokumentiert. (siehe Anlage)


    Aufgrund der angegebenen Funktionen hab ich eine ungefähre Idee, in welchem Bereich es klemmen muss. Ich wäre aber dankbar, falls ein Profi mir vielleicht helfen könnte, wie man da möglichst konkrete Details rauskriegt.


    Das Problem tritt übrigens nur mit vdr 1.6.0, nicht aber mit 1.4.7 auf.

    Dateien

    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

  • Bin zwar kein GDB Profi und mit C hab ichs auch nicht so, aber bei Java sieht das ähnlich aus:


    #0 0x52633631 in ?? ()
    #1 0x080ef65f in cRingBufferLinear::Get ()
    #2 0xb7a2f109 in cPvrDevice::GetTSPacket ()
    from /usr/lib/vdr/plugins/libvdr-pvrinput.so.1.6.0
    #3 0x0809e730 in cDevice::Action ()
    #4 0x0810a76c in cThread::StartThread ()
    #5 0xb7f47240 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
    #6 0xb7d1f49e in clone () from /lib/tls/i686/cmov/libc.so.6


    In dem Fall würd ich sagen Du solltest in der Funktion #1 cRingBufferLinear::Get () auf die suche gehen. Solltest Du da nichts finden, dann eventuell in cPvrDevice::GetTSPacket ().


    Gruß
    TheChief

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Normalerweise spuckt der GDB auch den Highlevel Language Code aus, aber dafür müssen die Debuginformation vorhanden sein. Das scheint der Ausgabe nach aber nicht der Fall zu sein:
    "Reading symbols from /usr/lib/vdr/plugins/libvdr-pvr350.so.1.6.0...(no debugging symbols found)...done."


    Also am besten mal das Plugin und den VDR nach dem Bauen nicht mittels "strip" von den Debugsymbolen befreien.

  • Zitat

    Originally posted by Ioannis
    Also am besten mal das Plugin und den VDR nach dem Bauen nicht mittels "strip" von den Debugsymbolen befreien.


    und sicherstellen, dass der C++-Compiler die Option "-g" bekommt.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Zitat

    Original von gda


    und sicherstellen, dass der C++-Compiler die Option "-g" bekommt.


    Gerald


    im Makefile steht


    Code
    ### The C compiler and options:
    
    
    CC       = gcc
    CFLAGS   = -g -O2 -Wall
    
    
    CXX      = g++
    CXXFLAGS = -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses


    sollte also reichen, oder?

    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 ()

  • Zitat

    Originally posted by Ioannis
    Evtl. ist es zum Debuggen auch noch hilfreich die Optimierung abzuschalten, also -O0 statt -O2.


    Stimmt, sonst hüpft gdb bei Schleifen seltsam herum und hat immer genau
    die Variable weg optimiert, die einen gerade interessiert.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • so, habe alles neu kompiliert und backtraces erstellt (siehe Anlage)


    Leider werde ich mit meinen bescheidenen Kenntnissen nicht wirklich schlauer. Dies ausgewiesenen Stellen sind immer unterschiedlich, wobei immer wieder Action() beteiligt ist.


    Die Zeile 244 in thread.c lautet:


    void *cThread::StartThread(cThread *Thread)
    {
    Thread->childThreadId = ThreadId();
    if (Thread->description)
    dsyslog("%s thread started (pid=%d, tid=%d)", Thread->description, getpid(), Thread->childThreadId);
    Thread->Action();
    if (Thread->description)
    dsyslog("%s thread ended (pid=%d, tid=%d)", Thread->description, getpid(), Thread->childThreadId);
    Thread->running = false;
    Thread->active = false;
    return NULL;
    }


    Ich weiss bloß nicht, was in pvrinput`s Action() seit vdr 1.6.0 plötzlich falsch sein soll:


    Kompletter Plugin-Code:
    http://drseltsam.device.name/v…g/pvrinput-2007-11-29.tgz

    Dateien

    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

    2 Mal editiert, zuletzt von Dr. Seltsam ()

  • Zitat

    Originally posted by Dr. Seltsam
    Leider werde ich mit meinen bescheidenen Kenntnissen nicht wirklich schlauer. Dies ausgewiesenen Stellen sind immer unterschiedlich, wobei immer wieder Action() beteiligt ist.
    [/URL]


    Das ist schwierig. Die Fehlermeldungen deuten daraufhin dass irgendwo
    der Stack überschrieben wird. Action() selbst sieht aber sauber aus.
    In ParseProgramStream() scheint auf den ersten Blick nicht sichergestellt
    zu sein, dass pes_buffer nicht überläuft, aber pes_buffer liegt nicht auf dem
    Stack. Ich würde mir trotzdem ParseProgramStream() genauer ansehen.
    Wie ich schon sagte, das ist schwierig, da würde auch ich schon
    ein bisschen länger dran sitzen und ich mach so was beruflich.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • PesToTs() mit ts_buffer[] ist aber auch ein Kandidat.


    Diese Zeile hat mich erst etwas irritiert:

    Code
    pos += Length - pos;


    aber das ist einfach

    Code
    pos = Length;


    Vielleicht ist ParseProgramStream() doch unschuldig, schau mal nach
    PesToTs()


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • ts_buffer ist hardcoded auf 188 Bytes, aber es wird mit TS_SIZE bytes
    an PutData übergeben. Steht TS_SIZE auf 188 Bytes?


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Ein TS paket hat immer 188 bytes - ja.

  • was ich vielleicht noch erwähnen sollte:


    immer dann, wenn vdr beim Beenden mit Strg-C hängt, habe ich in der Auflistung von top keinen vdr-Prozess mehr. Trotzdem muss noch einer da sein, denn erst ein "killall -9 vdr" führt dazu, dass das programm wirklich beendet wird.


    Wenn da in ParseProgramStream() und/oder PesToTs() ein Bug ist, dann muss er sehr alt sein. Ich habe spaßeshalber mal diese beiden Funktionen aus der älteren 0.1.1-Version (die letzte, die der ursprüngliche Author noch selbst veröffentlicht hatte) reinimportiert. Ist genau das gleiche ...

    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

  • Zitat

    Originally posted by Dr. Seltsam
    Wenn da in ParseProgramStream() und/oder PesToTs() ein Bug ist, dann muss er sehr alt sein. Ich habe spaßeshalber mal diese beiden Funktionen aus der älteren 0.1.1-Version (die letzte, die der ursprüngliche Author noch selbst veröffentlicht hatte) reinimportiert. Ist genau das gleiche ...


    Diese beiden Methoden rufen aber Funktionen des VDR auf, dann würde
    ich da weiter nach Unverträglichkeiten suchen. Ich bleibe dabei, dass
    das Fehlerbild durch einen kaputten Stack hervorgerufen wird. Mit
    größter Wahrscheinlichkeit durch ein übergelaufenes Array.


    Wenn alles nichts hilft, dann brauchst du Valgrind.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Hi,


    ich schliesse mich mal gda an.


    Anbei ist mal das Diff der ringbuffer.c von 1.4.7 und 1.6.0 (farblich auch als HTML). Da hat sich ein wenig geändert.


    Ich würde einfach mal die ringbuffer.c vom 1.6.0 mit der vom 1.4.7 ersetzen und neu bauen.


    Wenn der Fehler dann weg ist, hast Du deinen "Schuldigen". ;)


    Gruss


    Macavity


    P.S.: Bei der ringbufferDiff.htm.txt bitte das .txt entfernen.

    Dateien

    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

  • Da haben wir es doch schon in "uchar *cRingBufferLinear::Get(int &Count)":

    Code
    uchar *p = buffer + tail;
    if ((cont = DataReady(p, cont)) > 0) {
         Count = gotten = cont;
         return p;
    }


    Das geht doch ganz furchtbar in die Hose.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Für einen schnellen Test ob es das ist, einfach mal

    Code
    static uchar *p = buffer + tail;


    schreiben.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

    Einmal editiert, zuletzt von gda ()

  • Nur bloss nicht so lassen! Das ist nicht reentrant!


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Ist Quatsch was ich geschrieben habe, p ist zwar weg, aber der buffer
    ist ja noch da.


    Eine Woche Kernel-Treiber debuggen mach mürbe.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • ich setzte trotzdem alle meine Hoffnungen auf Dich :)

    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

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!