Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
186
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    153
    Hi Leute,

    ich habe mal wieder ein Problem bei meinem Gstreamer Plugin bei dem ich im Moment nicht weiterkomme. Ich bekomme ab und an während der Ausführung einen SIGSEGV geschmissen, allerdings konnten mir bisher weder gdb noch valgrind weiterhelfen. Vielleicht hat einer von euch eine Idee.
    Laut gdb tritt der Fehler in folgender Zeile meines Programms auf:

    Code cpp:
    1
    
    xmltio::Location templateloc(TEMPLATE, "SOUND");

    Wobei TEMPLATE folgendes ist:

    Code cpp:
    1
    2
    3
    4
    5
    
    const std::string TEMPLATE =
        "<SOUND>"
            "<DURATION timeInSeconds=\"\"/>"
            "<FREQUENCIES nrValues=\"\" value0=\"\" value1=\"\" value2=\"\" value3=\"\" value4=\"\" value5=\"\"/>"
        "</SOUND>";

    Und valgrind sagt mir folgendes:

    Code :
    1
    2
    3
    
    valgrind: m_mallocfree.c:210 (get_bszB_as_is): Assertion 'bszB_lo == bszB_hi' failed.
    valgrind: Heap block lo/hi size mismatch: lo = 4288479132, hi = 1632849498.
    Probably caused by overrunning/underrunning a heap block's bounds.

    Ich hänge das Plugin mal als zip an diesen Post an, falls jemand Interesse hat da rein zu schauen. Im Moment sind mir die Ideen ausgegangen. Kann sein, dass ich Fehler bei der Verwendung der std::vector - en mache, dass kann gut sein.

    Ich teste das Plugin im Moment mit folgender Kette:

    Code :
    1
    
    gst-launch-0.10 alsasrc device=plug:hw:1 ! audioanalyse ! alsasink

    Falls jemand das selbst ausprobieren will, braucht er zum kompilieren die gstreamer libs und die xmltio lib.

    Gruß
    Der Wolf
    Angehängte Dateien Angehängte Dateien
    Geändert von Der Wolf (01.09.10 um 16:47 Uhr) Grund: Missing G added.
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    7.983
    Hi.

    Es heißt SIGSEGV (signal segment violation).

    Warum definierst du TEMPLATE im Header?

    Du hast delete statt delete[] verwendet.

    \edit: Der Fehler dürfte allerdings hier sein:
    Code cpp:
    1
    2
    3
    
        // Copy new signal into vector.
        memcpy(&signal[nrSamples], (gint16*) buffer->data, buffer->size);
        nrSamples += buffer->size / sizeof(gint16);
    Du schreibst da etwas in den Vektor ohne zu prüfen ob überhaupt genug Platz im Vektor ist. Danach prüfst du sogar noch ob du über die Größe des Vektors hinausgeschrieben hast...

    Und Makros sollte man äußerst sparsam einsetzen, eine inline Funktion ist (fast) immer vorzuziehen.

    Außerdem würde ich einfach nur den Vektor benutzen statt die nrSamples noch extra mitzuzählen...
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    const int sig_max = 44100;
     
    signal.reserve(sig_max);
     
    const gint16* d = reinterpret_cast<const gint16*>(buffer->data);
    signal.insert(signal.end(),
      d, 
      d + std::min(sig_max - signal.size(), buffer->size  / sizeof(gint16)));
     
    if (signal.size() == sig_max) {
      // verarbeiten
      ...
      signal.clear();
    }
    Gruß
    Geändert von deepthroat (02.09.10 um 09:47 Uhr) Grund: Fehler bei Indexberechnung
    Der Wolf bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    153
    Hmm,

    ja, hab mal wieder das G vergessen.

    Die Definition im Header war jetzt einfach so. Sollte auch doch erstmal egal sein, oder? Nur vielleicht etwas ungeschickt, aber da die Header Datei im Moment noch nirgendwo sonst eingebunden wird, vorerst egal.

    Ich hab das delete[] verbessert, bekomme jetzt allerdings den Fehler in der Zeile mit dem delete[].

    Edit: Ah ok. Vielen Dank. Das scheint den Fehler wirklich behoben zu haben. Ich hatte vergessen mal durchzurechnen ob es geschehen kann, dass die Samples die ich in den Vektor schreibe mehr sind, als der std::vector fassen kann und ich dadurch mit memcpy eventuell in den falschen Speicher schreibe. Vielen vielen Dank.

    Gruß
    Der Wolf
    Geändert von Der Wolf (01.09.10 um 17:56 Uhr)
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 11.01.11, 21:40
  2. Antworten: 4
    Letzter Beitrag: 22.03.06, 20:50
  3. Antworten: 0
    Letzter Beitrag: 06.10.04, 14:03
  4. PROBLEM! Pinnacle 2 GB Begrenzung Windows 2000 DC 50 PROBLEM!
    Von hennym im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 6
    Letzter Beitrag: 17.09.03, 22:09
  5. Antworten: 6
    Letzter Beitrag: 13.06.02, 12:29