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
Vielleicht fügen Sie ein Beispiel für die "fast die gleiche" Instanziierung, die funktioniert? – Amber