# New Ticket Created by  Andy Dougherty 
# Please include the string:  [perl #38576]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=38576 >


While trying to debug an "Out of mem" PANIC, I decided to try using
DETAIL_MEMORY_DEBUG in src/memory.c.  Alas, it didn't help for two 
reasons:
1.  It prints to standard output, so that when you try to rebuild
parrot, you get things like

    $ make parrot
    Invoking Parrot to generate runtime/parrot/include/config.fpmc --cross your 
fingers
    ./miniparrot config_lib.pasm > runtime/parrot/include/config.fpmc
    perl5.6 tools/build/parrot_config_c.pl > src/parrot_config.c
    [ . . . ]
    cc -o parrot [. . . ] src/parrot_config.o [ . . . ]

which ends up putting all that debug information into
src/parrot_config.o, and, eventually, into parrot.  The resulting
parrot dumps core immediately.  Not very helpful.

2.  Some (but not all) of the debugging statements were *after* the
call to PANIC.  That means that you never get to see the call to the
function that triggered the panic.

The following patch to src/memory.c re-orders statements, and prints to
stderr instead of stdout.  I know stderr might not be available in
all situations, but this at least can work sometimes.

Finally, I put in a guard against calling free(0).  It might not be
necessary, but we do end up trying to call it, and old habits die
hard.:-).

--- parrot-current/src/memory.c Sat Feb 11 12:23:31 2006
+++ parrot-andy/src/memory.c    Wed Feb 15 12:36:51 2006
@@ -41,11 +41,11 @@
 mem_sys_allocate(size_t size)
 {
     void *ptr = malloc((size_t)size);
-    if (!ptr)
-        PANIC("Out of mem");
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Allocated %i at %p\n", size, ptr);
+    fprintf(stderr, "Allocated %i at %p\n", size, ptr);
 #endif
+    if (!ptr)
+        PANIC("Out of mem");
     return ptr;
 }
 
@@ -54,7 +54,7 @@
 {
     void *ptr = malloc((size_t)size);
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Internal malloc %i at %p (%s/%d)\n", size, ptr, file, line);
+    fprintf(stderr, "Internal malloc %i at %p (%s/%d)\n", size, ptr, file, 
line);
 #endif
     if (!ptr)
         PANIC("Out of mem");
@@ -76,11 +76,11 @@
 mem_sys_allocate_zeroed(size_t size)
 {
     void *ptr = calloc(1, (size_t)size);
-    if (!ptr)
-        PANIC("Out of mem");
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Allocated %i at %p\n", size, ptr);
+    fprintf(stderr, "Allocated %i at %p\n", size, ptr);
 #endif
+    if (!ptr)
+        PANIC("Out of mem");
     return ptr;
 }
 
@@ -88,11 +88,11 @@
 mem__internal_allocate_zeroed(size_t size, const char *file, int line)
 {
     void *ptr = calloc(1, (size_t)size);
-    if (!ptr)
-        PANIC("Out of mem");
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Internal malloc %i at %p (%s/%d)\n", size, ptr, file, line);
+    fprintf(stderr, "Internal malloc %i at %p (%s/%d)\n", size, ptr, file, 
line);
 #endif
+    if (!ptr)
+        PANIC("Out of mem");
     return ptr;
 }
 
@@ -112,14 +112,14 @@
 {
     void *ptr;
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Freed %p (realloc -- %i bytes)\n", from, size);
+    fprintf(stderr, "Freed %p (realloc -- %i bytes)\n", from, size);
 #endif
     ptr = realloc(from, size);
-    if (!ptr)
-         PANIC("Out of mem");
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Allocated %i at %p\n", size, ptr);
+    fprintf(stderr, "Allocated %i at %p\n", size, ptr);
 #endif
+    if (!ptr)
+         PANIC("Out of mem");
     return ptr;
 }
 
@@ -127,12 +127,12 @@
 mem__internal_realloc(void *from, size_t size, const char *file, int line)
 {
     void *ptr = realloc(from, size);
-    if (!ptr)
-        PANIC("Out of mem");
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("internal free of %p (realloc -- %i bytes) (%s/%d)\n", from, size, 
file, line);
-    printf("Internal malloc %i at %p (%s/%d)\n", size, ptr, file, line);
+    fprintf(stderr, "internal free of %p (realloc -- %i bytes) (%s/%d)\n", 
from, size, file, line);
+    fprintf(stderr, "Internal malloc %i at %p (%s/%d)\n", size, ptr, file, 
line);
 #endif
+    if (!ptr)
+        PANIC("Out of mem");
     return ptr;
 }
 #undef interpreter
@@ -152,16 +152,17 @@
 mem_sys_free(void *from)
 {
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Freed %p\n", from);
+    fprintf(stderr, "Freed %p\n", from);
 #endif
-    free(from);
+    if (from)
+       free(from);
 }
 
 void
 mem__internal_free(void *from, const char *file, int line)
 {
 #ifdef DETAIL_MEMORY_DEBUG
-    printf("Internal free of %p (%s/%d)\n", from, file, line);
+    fprintf(stderr, "Internal free of %p (%s/%d)\n", from, file, line);
 #endif
     free(from);
 }

-- 
    Andy Dougherty              [EMAIL PROTECTED]

Reply via email to