SIGSEV Problem

Der Wolf

Erfahrenes Mitglied
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:

C++:
xmltio::Location templateloc(TEMPLATE, "SOUND");

Wobei TEMPLATE folgendes ist:

C++:
const std::string TEMPLATE =
	"<SOUND>"
		"<DURATION timeInSeconds=\"\"/>"
		"<FREQUENCIES nrValues=\"\" value0=\"\" value1=\"\" value2=\"\" value3=\"\" value4=\"\" value5=\"\"/>"
	"</SOUND>";

Und valgrind sagt mir folgendes:

Code:
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:
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
 

Anhänge

Zuletzt bearbeitet:
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:
C++:
    // 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...
C++:
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ß
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
Zurück