Memory-Debugger?
lima-city → Forum → Programmiersprachen → C/C++ und D
array
ausrede
betrachten
code
compiler
double
entschuldigung
fehler
gesamte programm
http
laufzeit
listen
passieren
problem
programm
queue
schau
schreibfehler
url
windows
-
Ich baue gerade an einem umfangreichen Programm. Dabei werden hin und wieder Variablen / Strukturen (mit scheinbar zufälligen Werten) überschrieben.
Meine Vermutung ist dass irgendwo über eine Array-Grenze hinaus geschrieben wird. Den gesamten Quellcode manuell durchzusuchen ist fast unmöglich. Ich finde aber kein Programm (wenn möglich Freeware) das in der Lage ist solche Fehler (während der Laufzeit) zu finden.
Ich nutze gcc (mingw) unter Windows 7 (mudflap funktioniert aber z.B. nicht unter Windows).
Beitrag zuletzt geändert: 20.12.2011 16:34:54 von hackyourlife -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo hackyourlife,
da gibt es zum Beispiel electric-fence-win32 oder DUMA. Das sind beides Ports der Electric Fence Library von Linux.
Evtl. kann man auch mit VMMap oder DrMemory was machen.
Du musst Dir die Sachen halt mal anschauen. -
Also wenn du Probleme mit Overflows hast, empfehle ich dir nochmals gut deinen Code zu betrachten. Es sollte eigentlich immer so programmiert werden, dass solche Fehler erst gar nicht möglich werden. (z.B. std::vector)
Ansonsten gibt es 'checker' von gcc. http://www.gnu.org/software/checker/
Weiter sollte gdc seinen Job auch gut tun. -
klasset schrieb:
Also wenn du Probleme mit Overflows hast, empfehle ich dir nochmals gut deinen Code zu betrachten.
Es reicht aber meist ein Schreibfehler aus, und schon läuft eine for-Schleife zu oft durch (die ein Array beschreibt) und schon stürzt alles ab. Das Problem dabei: der winzige Unterschied bei folgendem:u16* buffer = (u16*) malloc(puffergroesse * sizeof(16));
Diesen Fehler (vergessenes "u" beim sizeof) wird der Compiler nicht anzeigen, trotzdem wird das programm abstrürzen, da sizeof(16) = 1; sizeof(u16) = 2 (dabei ist das ganze nur ein unabsichtlicher Schreibfehler!)
Solche Fehler überliest man aber schnell bei 64 Quelldateien und 54 Headerdateien.
klasset schrieb:
Natürlich schau ich dass solche Fehler nicht passieren. Wegen dem std::vector: dumm nur dass das gesamte Programm ausschließlich in C (und nicht C++!) geschrieben ist.
Es sollte eigentlich immer so programmiert werden, dass solche Fehler erst gar nicht möglich werden. (z.B. std::vector) -
Hallo hackyourlife,
um solche Fehler zumindest ein wenig einzudämmen empfehle ich die Finger von malloc()/calloc() zu lassen und die Arrays per Konstruktor zu erstellen. Desweiteren sollte man die Größe des Arrays in selbigem abspeichern. Sowas kann man sich sehr leicht auch generisch erzeugen lassen:
array_template.h:
Dazu dann alles übliche vordefinieren:#ifndef _ARRAY_TEMPLATE_H_ #define _ARRAY_TEMPLATE_H_ #define DECLARE_ARRAY(pointer_name, base_type) \ typedef base_type* pointer_name;\ pointer_name pointer_name##_Create(long size); \ void pointer_name##_Free(pointer_name arr); \ long pointer_name##_GetSize(const pointer_name arr); #define IMPLEMENT_ARRAY(pointer_name, base_type) \ pointer_name pointer_name##_Create(long size) \ { \ long * tmp; \ \ if(size<1) return NULL; \ \ if(!(tmp=(long*)calloc(1,sizeof(long)+size*sizeof(base_type)))) \ return NULL; \ \ tmp[0] = size; \ tmp++; \ \ return (pointer_name) tmp; \ } \ \ void pointer_name##_Free(pointer_name arr) \ { \ long * tmp; \ if(!arr) \ return; \ \ tmp = (long*)arr; \ tmp--; \ free(tmp); \ } \ \ long pointer_name##_GetSize(const pointer_name arr) \ { \ long * tmp; \ if(!arr) \ return 0; \ \ tmp = (long*)arr; \ return tmp[-1]; \ } #endif /* _ARRAY_TEMPLATE_H_ */
array.h:
array.c:#ifndef _ARRAY_H_ #define _ARRAY_H_ #include <stdbool.h> #include "array_template.h" #ifdef __cplusplus extern "C" { #endif DECLARE_ARRAY(BoolArray, bool) DECLARE_ARRAY(ChrArray, char) DECLARE_ARRAY(UChrArray, unsigned char) DECLARE_ARRAY(SIntArray, short int) DECLARE_ARRAY(USIntArray, unsigned short int) DECLARE_ARRAY(IntArray, int) DECLARE_ARRAY(UIntArray, unsigned int) DECLARE_ARRAY(LngArray, long) DECLARE_ARRAY(ULngArray, unsigned long) DECLARE_ARRAY(FltArray, float) DECLARE_ARRAY(DblArray, double) DECLARE_ARRAY(PtrArray, void *) #ifdef __cplusplus } #endif #endif
Und schon kann man folgendes machen:#include "array.h" IMPLEMENT_ARRAY(BoolArray, bool) IMPLEMENT_ARRAY(ChrArray, char) IMPLEMENT_ARRAY_SSE(UChrArray, unsigned char) IMPLEMENT_ARRAY(SIntArray, short int) IMPLEMENT_ARRAY(USIntArray, unsigned short) IMPLEMENT_ARRAY(IntArray, int) IMPLEMENT_ARRAY(UIntArray, unsigned int) IMPLEMENT_ARRAY(LngArray, long) IMPLEMENT_ARRAY(ULngArray, unsigned long) IMPLEMENT_ARRAY_SSE(FltArray, float) IMPLEMENT_ARRAY_SSE(DblArray, double) IMPLEMENT_ARRAY(PtrArray, void*)
Das funktioniert natürlich auch mit Vektoren, Listen, Queues, Stacks usw. Also ist C keine Ausrede#include "array.h" int main(int argc, char ** argv) { long i; LngArray arr = LngArray_Create(100); for(i=0; i< LngArray_GetSize(arr); i++) arr[i] = i; LngArray_Free(arr); return 0; }
Beitrag zuletzt geändert: 24.12.2011 3:31:58 von darkpandemic -
darkpandemic schrieb:
Wo ist dieses
array.c:
IMPLEMENT_ARRAY_SSE(UChrArray, unsigned char) ... IMPLEMENT_ARRAY_SSE(FltArray, float) IMPLEMENT_ARRAY_SSE(DblArray, double)
definiert?IMPLEMENT_ARRAY_SSE
-
Hallo hackyourlife,
entschuldigung, das war ein Fehler auf meiner Seite.
Nimm einfach das _SSE am Ende weg.
Edit: Siehe den nachfolgenden Post (War keine Absicht)
Beitrag zuletzt geändert: 25.12.2011 1:54:06 von darkpandemic -
Natürlich schau ich dass solche Fehler nicht passieren. Wegen dem std::vector: dumm nur dass das gesamte Programm ausschließlich in C (und nicht C++!) geschrieben ist.
Hmmm dachte ich mir noch halbwegs, aber stand halt nirgendswo und da es nur selten Gründe gibt in C statt C++ zu programmieren, nahm ich C++ an.
darkpandemic schrieb:
Hallo kackyourlife,
Ehrm lol -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage