X

ACHTUNG mem Fehler in dprintf

Einklappen
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • nit
    nit
    Developer
    • 24.02.2009
    • 4684

    ACHTUNG mem Fehler in dprintf

    Mir ist es endlich gelungen nach 2 Tagen suche den memoryleak im libeplayer2 zu finden.

    Schuld war die funktion dprintf.

    Diese interne LinuxFunktion hat einen Fehler und sollte daher nicht benutzt werden. Bei jedem Aufruf werden ein paar KB Mem reserviert und nicht mehr freigegeben.

    Die Memauslastung steigt dann bis zu ca. 2800 MB an (bis der Stack mem bereich des Programmes erreicht wird und kein weiterer mem mehr reserviert werden kann)

    Ich habe kurz mal nachgeschaut wo diese Funktion überall verwendet wird.

    Hab gesehen, das ist in E2, E1 und Neutrino. In VDR konnte ich nix finden.

    Hier ein kleines Testprogramm mit dem man das auch schön testen kann.

    main()
    {
    int x=0;
    while(x<5000)
    dprintf("test\n");
    sleep(20);
    }

    einfach mit sh-linux-cpp compilieren und die a.out auf der Kathi anstarten. Dann einen top machen bevor das programm beendet (20 sekunden sind zeit).

    Das Programm hat dann eine Memauslastung von über 2800MB.

  • #2
    Wenn ich das richtig sehe beendet sich das Testprogramm überhaupt nicht, da fehlt ein x++; in der Schleife

    Kommentar

    • nit
      nit
      Developer
      • 24.02.2009
      • 4684

      #3
      ja stimmt, hab ich auch grad gesehen, ist aber für den sinn des programmes egal

      Kommentar

      • BPanther
        Erfahrener Benutzer
        • 25.03.2008
        • 9279

        #4
        Gut zu wissen, danke. Dann sollte man das also einfach mal alles deaktivieren...
        Vielleicht ist das auch das Problem im Player von Neutrino.
        MfG BPanther - neutrino.mbremer.de

        Kommentar

        • nit
          nit
          Developer
          • 24.02.2009
          • 4684

          #5
          deaktivieren finde ich nicht so gut.

          eine möglichkeit wäre ein macro mit dem namen dprintf anzulegen, sofern keines existiert, und im Macro auf die funktion printf zu gehen.

          Kommentar

          • BPanther
            Erfahrener Benutzer
            • 25.03.2008
            • 9279

            #6
            Du meinst sicherlich das hier:

            Code:
            #define dprintf(x...) do { printf(x); } while (0)
            Das müsste dann in jede *.cpp rein, wo dprintf verwendet wird?
            Und dann am besten gleich ohne #ifdef DEBUG.
            MfG BPanther - neutrino.mbremer.de

            Kommentar

            • BrechREiZ
              Erfahrene Benutzer
              • 03.01.2010
              • 215

              #7
              Code:
              #define dprintf(fmt, args...) do { printf(fmt, ##args); } while (0)
              Bin gerade dabei, beim VDR ist das noch in vfd/common.h zu finden.

              Kommentar

              • BrechREiZ
                Erfahrene Benutzer
                • 03.01.2010
                • 215

                #8
                gerade mal probe gebaut. In Neutrino wird dprintf bereits in system/debug.h definiert, und auf printf umgeleitet.

                Code:
                #define dprintf(debuglevel, fmt, args...) {if(debug>=debuglevel) printf( "[neutrino] " fmt, ## args);

                Kommentar

                • BPanther
                  Erfahrener Benutzer
                  • 25.03.2008
                  • 9279

                  #9
                  Ganz so einfach ist es wohl nicht, denn es steht fast nie vor einer dprintf auch ein #ifdef DEBUG - somit dürfte der dprintf-Bug dennoch zuschlagen, wenn kein Debug-Image gebaut wird.
                  MfG BPanther - neutrino.mbremer.de

                  Kommentar

                  • kirepudsje
                    Benutzer
                    • 25.08.2008
                    • 68

                    #10
                    Vielleicht geht es hier mit, dan greift es zumindest nicht zuruck auf die kernel
                    Code:
                    #ifdef DEBUG
                    #define dprintf(x...) do { printf(x); } while (0)
                    #else
                    #define dprintf(x...)
                    #endif
                    oder sogar
                    Code:
                    #ifdef DEBUG
                    #define dprintf(x...) do { printf(x); } while (0)
                    #else
                    #define dprintf(x...) do { {char put_ifdef_DEBUG_and_endif_around_this_line[-1];} } while (0)
                    #endif

                    Kommentar

                    • BPanther
                      Erfahrener Benutzer
                      • 25.03.2008
                      • 9279

                      #11
                      Das 2. klingt interessant. Wenn ich das richtig verstehe, dann erzeugt das sozusagen ein #ifdef DEBUG / #endif vor bzw. hinter die dprintf line - richtig?
                      MfG BPanther - neutrino.mbremer.de

                      Kommentar

                      • kirepudsje
                        Benutzer
                        • 25.08.2008
                        • 68

                        #12
                        Nein, es erzeugt nur ein kompile Fehler, da die groesse negatif ist. Die nahme der variable wird dan gezeigt. Es wird misbraucht als tekst der Fehlermeldung.
                        Die gebraucher sollte dan noch per Hand #ifdef DEBUG dorthin setzen.

                        Kommentar

                        • BPanther
                          Erfahrener Benutzer
                          • 25.03.2008
                          • 9279

                          #13
                          Hmm, dann wohl eher nicht. Das ist recht aufwändig die Zeilen alle rauszusuchen (habe ich vorhin beim ersten mal gemacht) und anzupassen, da auch einige "leere" if/else Anweisungen darauf laufen. Dann doch besser in den Hauptdateien umdefinieren.
                          MfG BPanther - neutrino.mbremer.de

                          Kommentar

                          • würmchen
                            Neuer Benutzer
                            • 03.02.2008
                            • 40

                            #14
                            Warum fixt Ihr nicht einfach den Fehler in der Funktion?
                            Dann laufen andere auch nicht mehr in das Problem.

                            Kommentar

                            • Thomas4711
                              Erfahrene Benutzer
                              • 14.08.2009
                              • 37672

                              #15
                              Weil, so wie ich das verstehe, der Fehler in STM Linux selber liegt und da können die Devs nichts ändern.
                              ---------------------------

                              et10000; D-Cube R2; Prismcube Ruby; Venton HD1; Mara M9 u.a.m mit OpenATV 4.1
                              Astra 19,2 und 28,2 an Atemio Multischalter Premium-Line 9/20
                              Ligawo HDMI Matrix 4x2 - Multifunction per spdif an LG NB3530A 2.1 Soundbar

                              Kommentar

                              Nicht konfiguriertes PHP-Modul

                              Einklappen

                              ACHTUNG mem Fehler in dprintf

                              Einklappen
                              Lädt...
                              X