kostenloser Webspace werbefrei: lima-city


Memory-Debugger?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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.
  4. 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. ;-)
  5. Autor dieses Themas

    hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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:
    Es sollte eigentlich immer so programmiert werden, dass solche Fehler erst gar nicht möglich werden. (z.B. std::vector)
    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.
  6. 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:
    #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_ */
    Dazu dann alles übliche vordefinieren:
    array.h:
    #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
    array.c:
    #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*)
    Und schon kann man folgendes machen:
    #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;
    }
    Das funktioniert natürlich auch mit Vektoren, Listen, Queues, Stacks usw. Also ist C keine Ausrede ;-)


    Beitrag zuletzt geändert: 24.12.2011 3:31:58 von darkpandemic
  7. Autor dieses Themas

    hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    darkpandemic schrieb:
    array.c:
    IMPLEMENT_ARRAY_SSE(UChrArray, unsigned char)
    ...
    IMPLEMENT_ARRAY_SSE(FltArray, float)
    IMPLEMENT_ARRAY_SSE(DblArray, double)
    Wo ist dieses
    IMPLEMENT_ARRAY_SSE
    definiert?
  8. Hallo hackyourlife,

    entschuldigung, das war ein Fehler auf meiner Seite.
    Nimm einfach das _SSE am Ende weg.

    Edit: Siehe den nachfolgenden Post :megarofl: (War keine Absicht)


    Beitrag zuletzt geändert: 25.12.2011 1:54:06 von darkpandemic
  9. 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 :-D
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!