More debug goodies:
authorTon Roosendaal <ton@blender.org>
Mon, 27 Nov 2006 13:59:55 +0000 (13:59 +0000)
committerTon Roosendaal <ton@blender.org>
Mon, 27 Nov 2006 13:59:55 +0000 (13:59 +0000)
WINDOWS CRASH EMULATION!

If you use the -d (debug) argument for starting blender, it will now:

- set all freed memory to 0xFFFFFFFF
- set all malloced memory to 0xFFFFFFFF

The first option will give nice crashers when you read from freed memory.
The second option is for OSX especially, it has the nasty habit to give
zeroed mallocs.

intern/guardedalloc/MEM_guardedalloc.h
intern/guardedalloc/intern/mallocn.c

index ce9f2a273bd611ced24ea15b1a9d09a39732939a..26a9258d03bb0b0f80730559f8e6a793cef53cd5 100644 (file)
@@ -115,6 +115,10 @@ extern "C" {
        /** Set thread locking functions for safe memory allocation from multiple
            threads, pass NULL pointers to disable thread locking again. */
        void MEM_set_lock_callback(void (*lock)(void), void (*unlock)(void));
+       
+       /** Attempt to enforce OSX (or other OS's) to have malloc and stack nonzero */
+       void MEM_set_memory_debug(void);
+
 
 #ifdef __cplusplus
 }
index 77184ac9370d0ca5249de3e69152c90c17213df8..51c2a2427b5f9f56f8c1cd8366eb467b319dfca2 100644 (file)
@@ -120,6 +120,8 @@ static void (*error_callback)(char *) = NULL;
 static void (*thread_lock_callback)(void) = NULL;
 static void (*thread_unlock_callback)(void) = NULL;
 
+static int malloc_debug_memset= 0;
+
 #ifdef malloc
 #undef malloc
 #endif
@@ -187,6 +189,11 @@ void MEM_set_lock_callback(void (*lock)(void), void (*unlock)(void))
        thread_unlock_callback = unlock;
 }
 
+void MEM_set_memory_debug(void)
+{
+       malloc_debug_memset= 1;
+}
+
 int MEM_allocN_len(void *vmemh)
 {
        if (vmemh) {
@@ -253,6 +260,8 @@ void *MEM_mallocN(unsigned int len, const char *str)
        if(memh) {
                make_memhead_header(memh, len, str);
                mem_unlock_thread();
+               if(malloc_debug_memset && len)
+                       memset(memh+1, 255, len);
                return (++memh);
        }
        mem_unlock_thread();
@@ -447,10 +456,11 @@ static void remlink(volatile localListBase *listbase, void *vlink)
 static void rem_memblock(MemHead *memh)
 {
     remlink(membase,&memh->next);
-    if (memh->prev){
-        if (memh->next) MEMNEXT(memh->prev)->nextname = 
-MEMNEXT(memh->next)->name;
-        else MEMNEXT(memh->prev)->nextname = 0;
+    if (memh->prev) {
+        if (memh->next) 
+                       MEMNEXT(memh->prev)->nextname = MEMNEXT(memh->next)->name;
+        else 
+                       MEMNEXT(memh->prev)->nextname = NULL;
     }
 
     totblock--;
@@ -465,8 +475,11 @@ MEMNEXT(memh->next)->name;
         if (munmap(memh, memh->len + sizeof(MemHead) + sizeof(MemTail)))
             printf("Couldn't unmap memory %s\n", memh->name);
     }
-    else   
+    else {
+               if(malloc_debug_memset && memh->len)
+                       memset(memh+1, 255, memh->len);
         free(memh);
+       }
 #endif
 }