|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T x
Length: 7799 (0x1e77)
Types: TextFile
Names: »xdebug.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/microcode/xdebug.c«
/* Emacs, -*-C-*-an't you guess? */
/****************************************************************
* *
* Copyright (c) 1986 *
* Massachusetts Institute of Technology *
* *
* This material was developed by the Scheme project at the *
* Massachusetts Institute of Technology, Department of *
* Electrical Engineering and Computer Science. Permission to *
* copy this software, to redistribute it, and to use it for any *
* purpose is granted, subject to the following restrictions and *
* understandings. *
* *
* 1. Any copy made of this software must include this copyright *
* notice in full. *
* *
* 2. Users of this software agree to make their best efforts (a)*
* to return to the MIT Scheme project any improvements or *
* extensions that they make, so that these may be included in *
* future releases; and (b) to inform MIT of noteworthy uses of *
* this software. *
* *
* 3. All materials developed as a consequence of the use of *
* this software shall duly acknowledge such use, in accordance *
* with the usual standards of acknowledging credit in academic *
* research. *
* *
* 4. MIT has made no warrantee or representation that the *
* operation of this software will be error-free, and MIT is *
* under no obligation to provide any services, by way of *
* maintenance, update, or otherwise. *
* *
* 5. In conjunction with products arising from the use of this *
* material, there shall be no use of the name of the *
* Massachusetts Institute of Technology nor of any adaptation *
* thereof in any advertising, promotional, or sales literature *
* without prior written consent from MIT in each case. *
* *
****************************************************************/
/* File: MDEBUG.C
*
* This file contains primitives to debug the memory management in the
* Scheme system.
*
*/
#include "scheme.h"
#include "primitive.h"
\f
/* New debugging utilities */
#define FULL_EQ 0
#define SAFE_EQ 1
#define ADDRESS_EQ 2
#define DATUM_EQ 3
#define SAFE_MASK (~DANGER_BIT)
static Pointer *Find_Occurrence(From, To, What, Mode)
fast Pointer *From, *To;
Pointer What;
int Mode;
{ fast Pointer Obj;
switch (Mode)
{ default:
case FULL_EQ:
{ Obj = What;
for (; From < To; From++)
if (Safe_Type_Code(*From) == TC_MANIFEST_NM_VECTOR)
From += Get_Integer(*From);
else if (*From == Obj) return From;
return To;
}
case SAFE_EQ:
{ Obj = (What & SAFE_MASK);
for (; From < To; From++)
if (Safe_Type_Code(*From) == TC_MANIFEST_NM_VECTOR)
From += Get_Integer(*From);
else if (((*From) & SAFE_MASK) == Obj) return From;
return To;
}
case ADDRESS_EQ:
{ Obj = Datum(What);
for (; From < To; From++)
if (Safe_Type_Code(*From) == TC_MANIFEST_NM_VECTOR)
From += Get_Integer(*From);
else if ((Datum(*From) == Obj) &&
(GC_Type(*From) != GC_Non_Pointer))
return From;
return To;
}
case DATUM_EQ:
{ Obj = Datum(What);
for (; From < To; From++)
if (Safe_Type_Code(*From) == TC_MANIFEST_NM_VECTOR)
From += Get_Integer(*From);
else if (Datum(*From) == Obj) return From;
return To;
}
}
}
\f
static long Find_In_Area(Name, From, To, Obj, Mode, print_p, store_p)
char *Name;
Pointer *From, *To, Obj;
int Mode;
Boolean print_p, store_p;
{ fast Pointer *Where;
fast long occurrences = 0;
if (print_p) printf(" Looking in %s:\n", Name);
Where = From-1;
while ((Where = Find_Occurrence(Where+1, To, Obj, Mode)) < To)
{ occurrences += 1;
if (print_p)
#ifndef b32
printf("Location = 0x%x; Contents = 0x%x\n",
((long) Where), ((long) (*Where)));
#else
printf("Location = 0x%08x; Contents = 0x%08x\n",
((long) Where), ((long) (*Where)));
#endif
if (store_p)
/* Note that Make_Pointer (vs. Make_Non_Pointer) is correct here!! */
*Free++ = Make_Pointer(TC_ADDRESS, Where);
}
return occurrences;
}
#define PRINT_P 1
#define STORE_P 2
Pointer Find_Who_Points(Obj, Find_Mode, Collect_Mode)
Pointer Obj;
int Find_Mode, Collect_Mode;
{ long n = 0;
Pointer *Saved_Free = Free;
Boolean print_p = (Collect_Mode & PRINT_P);
Boolean store_p = (Collect_Mode & STORE_P);
/* No overflow check done. Hopefully referenced few times, or invoked before
to find the count and insure that there is enough space. */
if (store_p) Free += 1;
if (print_p)
{ putchar('\n');
#ifndef b32
printf("*** Looking for Obj = 0x%x; Find_Mode = %2d ***\n",
Obj, Find_Mode);
#else
printf("*** Looking for Obj = 0x%08x; Find_Mode = %2d ***\n",
Obj, Find_Mode);
#endif
}
n += Find_In_Area("Constant Space",
Constant_Space, Free_Constant, Obj,
Find_Mode, print_p, store_p);
n += Find_In_Area("the Heap",
Heap_Bottom, Saved_Free, Obj,
Find_Mode, print_p, store_p);
n += Find_In_Area("the Stack",
Stack_Pointer, (Stack_Top + 1), Obj,
Find_Mode, print_p, store_p);
if (print_p) printf("Done.\n");
if (store_p)
{ *Saved_Free = Make_Non_Pointer(TC_MANIFEST_VECTOR, n);
return Make_Pointer(TC_VECTOR, Saved_Free);
}
else return Make_Non_Pointer(TC_FIXNUM, n);
}
\f
Print_Memory(Where, How_Many)
Pointer *Where;
long How_Many;
{ fast Pointer *End = &Where[How_Many];
#ifndef b32
printf("\n*** Memory from 0x%x to 0x%x (excluded) ***\n", Where, End);
while (Where < End) printf("0x%x\n", *Where++);
#else
printf("\n*** Memory from 0x%08x to 0x%08x (excluded) ***\n", Where, End);
while (Where < End) printf("0x%08x\n", *Where++);
#endif
printf("Done.\n");
return;
}
\f
/* Primitives to give scheme a handle on utilities from DEBUG.C */
Define_Primitive(Prim_Show_Pure, 0, "SHOW-PURE")
{ printf("\n*** Constant & Pure Space: ***\n");
Show_Pure();
return TRUTH;
}
Define_Primitive(Prim_Show_Env, 1, "SHOW-ENV")
{ Primitive_1_Arg();
printf("\n*** Environment = 0x%x ***\n", Arg1);
Show_Env(Arg1);
return TRUTH;
}
Define_Primitive(Prim_Stack_Trace, 0, "STACK-TRACE")
{ Primitive_0_Args();
printf("\n*** Back Trace: ***\n");
Back_Trace();
return TRUTH;
}
Define_Primitive(Prim_Find_Symbol, 1, "FIND-SYMBOL")
{ Primitive_1_Arg();
Find_Symbol();
return TRUTH;
}
\f
/* Primitives to give scheme a handle on utilities on this file. */
Define_Primitive(Prim_Debug_Flags, 0, "DEBUG-FLAGS")
{ Handle_Debug_Flags();
return TRUTH;
}
Define_Primitive(Prim_Find_Who_Points, 3, "FIND-WHO-POINTS")
{ Primitive_3_Args();
return Find_Who_Points(Arg1, Get_Integer(Arg2), Get_Integer(Arg3));
}
Define_Primitive(Prim_Print_Memory, 2, "PRINT-MEMORY")
{ Pointer *Base;
Primitive_2_Args();
if (GC_Type(Arg1) == GC_Non_Pointer)
Base = ((Pointer *) Datum(Arg1));
else Base = Get_Pointer(Arg1);
Print_Memory(Base, Get_Integer(Arg2));
return TRUTH;
}
/* Like PRIMITIVE-SET-TYPE except that it is unsafe, and therefore more useful */
Define_Primitive(Prim_Make_Pointer, 2, "MAKE-POINTER")
{ Primitive_2_Args();
Arg_1_Type(TC_FIXNUM);
return Make_New_Pointer(Get_Integer(Arg1), Arg2);
}