2009-08-05 10 views
2

Ich entwickle eine Bildverarbeitungsanwendung in C++. Ich habe eine Menge Compiler-Fehler und Backtraces gesehen, aber diese ist neu für mich.Strange Backtrace - wo ist der Fehler?

#0 0xb80c5430 in __kernel_vsyscall() 
#1 0xb7d1b6d0 in raise() from /lib/tls/i686/cmov/libc.so.6 
#2 0xb7d1d098 in abort() from /lib/tls/i686/cmov/libc.so.6 
#3 0xb7d5924d in ??() from /lib/tls/i686/cmov/libc.so.6 
#4 0xb7d62276 in ??() from /lib/tls/i686/cmov/libc.so.6 
#5 0xb7d639c5 in malloc() from /lib/tls/i686/cmov/libc.so.6 
#6 0xb7f42f47 in operator new() from /usr/lib/libstdc++.so.6 
#7 0x0805bd20 in Image<Color>::fft (this=0xb467640) at ../image_processing/image.cpp:545 

Was passiert hier? Der neue Operator stürzt ab, ok. Aber warum? Das ist kein Arbeitsspeicher (es versucht 128Kb zuzuteilen, ein 128x64 Pixel mit jeweils zwei Floats). Es ist auch nicht Naht, da es ein Fehler in meinem eigenen Code ist (der Konstruktor wird nicht berührt!).

Der Code in der genannten Leitung (# 7):

Image<Complex> *result = new Image<Complex>(this->resX, resY); 
// this->resX = 128, resY = 64 (both int), Complex is a typedef for std::complex<float> 

Fast die gleiche Instanziierung arbeitet an anderen Orten in meinem Code. Wenn ich diesen Teil des Codes auskommentiere, stürzt er etwas später in einem ähnlichen Teil ab. Ich verstehe es nicht, ich habe auch keine Ideen, wie ich es debuggen kann. Irgendeine Hilfe?

Compiler gcc 4.3.3, libc ist 2.9 (beide von Ubuntu Jaunty)

Update:

ich die folgenden Zeilen direkt über der fehlerhaften Leitung in dem gleichen Verfahren aufgenommen haben und in main()

Die seltsame Sache: in der gleichen Methode wird es abstürzen, in main() wird es nicht. Wie ich bereits erwähnt habe, ist Complex ein typedef von std :: complex <float>. Der Konstruktor wird nicht aufgerufen, ich habe einen Cout direkt vor dieser Zeile und im Konstruktor selbst eingefügt.

Update 2:

Dank KPexEA für diesen Tipp! Ich habe es versucht:

Image<Complex> *test = new Image<Complex>(128, 64); 
delete test; 

kiss_fft_cpx *output = (kiss_fft_cpx*) malloc(this->resX * this->resY/2 * sizeof(kiss_fft_cpx)); 
kiss_fftndr(cfg, input, output); 

Image<Complex> *test2 = new Image<Complex>(128, 64); 
delete test2; 

Es stürzt bei - Sie raten? - test2! So scheint der Malloc für meinen Kussfault der Fehler zu sein. Ich werde es mir ansehen.

Schluss Update:

Ok, es ist vollbracht! Danke an euch alle!

Eigentlich hätte ich es vorher bemerkt. Letzte Woche bemerkte ich, dass kissfft (eine schnelle Fourier-Transformations-Bibliothek) aus einem 128x128-Pixel-Quellbild ein 130x64-Pixel-fft-Bild erstellte. Ja, 130 Pixel breit, nicht 128. Frag mich nicht warum, ich weiß es nicht! Also, 130x64x2xsizeof (float) Bytes mussten zugewiesen werden, nicht 128x64x ... wie ich vorher dachte. Seltsam, dass es nicht kurz nach dem Beheben dieses Fehlers abgestürzt ist, sondern einige Tage später.

Für das Protokoll, mein letzter Code ist:

int resY = (int) ceil(this->resY/2); 

kiss_fft_cpx *output = (kiss_fft_cpx*) malloc((this->resX+2) * resY * sizeof(kiss_fft_cpx)); 
kiss_fftndr(cfg, input, output); 

Image<Complex> *result = new Image<Complex>(this->resX, resY); 

Dank!

craesh

+0

Vielleicht fügen Sie ein Beispiel für die "fast die gleiche" Instanziierung, die funktioniert? – Amber

Antwort

5

Vielleicht ein zuvor zugewiesenen Teil des Speichers hat einen Pufferüberlauf, den Heap korrumpiert?

+1

Ich sehe definitiv diese Art von Zufallsfehler, wenn ein Zugriff außerhalb der Grenzen gemacht wird, überprüfen Sie den Rest Ihres Codes, denken Sie daran, Sie können ohne sofortigen Fehler außerhalb der Grenzen zugreifen, es versteckt sich einfach und erscheint zufällig in malloc/free new/Anrufe löschen Einer der frustrierendsten Bugs, die ich finde. – DeusAduro

0

Sie reservieren nicht genügend Speicher.Das Halbspektrumformat von kissfft (und FFTW und IMKL für diese Angelegenheit) enthält X * (Y/2 + 1) komplexe Elemente.

Siehe kiss_fftndr.h Header-Datei:

/* Eingang Timedata hat dims [0] X dims [1] X ... X dims [ndims-1] Skalar Punkte

Ausgang freqdata hat Dims [0] X Dims [1] X ... X Dims [ndims-1]/2 + 1 komplexe Punkte *