Преглед на файлове

Added stack low for variables in stack traces: references are now tested on stack or heap: trace of strings works again

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6782 8c9fc860-2736-0410-a75d-ab315db34111
felixf преди 9 години
родител
ревизия
9f5e853b6c
променени са 8 файла, в които са добавени 15 реда и са изтрити 16 реда
  1. 1 1
      source/ARM.Traps.Mod
  2. 3 3
      source/Debugging.Mod
  3. 5 5
      source/Generic.Reflection.Mod
  4. 1 1
      source/PCM.Mod
  5. 1 1
      source/ProcessInfo.Mod
  6. 2 3
      source/Reflection.Mod
  7. 1 1
      source/Traps.Mod
  8. 1 1
      source/Win32.Traps.Mod

+ 1 - 1
source/ARM.Traps.Mod

@@ -194,7 +194,7 @@ VAR
 			w.Ln;
 			w.String("Process:"); Reflection.WriteProcess(w, p); w.Ln;
 			w.String("Stack Traceback:"); w.Ln;
-			Reflection.StackTraceBack(w, int.PC, int.BP, Objects.GetStackBottom(p), long, overflow);
+			Reflection.StackTraceBack(w, int.PC, int.BP, int.SP, Objects.GetStackBottom(p), long, overflow);
 		END;
 		w.String("---------------------------------"); w.Ln;
 		w.Char(02X);	(* "end of trap" *)

+ 3 - 3
source/Debugging.Mod

@@ -51,19 +51,19 @@ VAR
 		ViewStack(oldbp,bp+4*SIZEOF(ADDRESS),s);
 	END Stack;
 
-	PROCEDURE TraceBackThis( eip, ebp: ADDRESS; stackhigh:LONGINT );   (* do a stack trace back w.r.t. given instruction and frame pointers *)
+	PROCEDURE TraceBackThis( eip, ebp: ADDRESS; stacklow, stackhigh:LONGINT );   (* do a stack trace back w.r.t. given instruction and frame pointers *)
 	BEGIN
 		Log.Ln;  Log.String( "#######################" );
 		Log.Ln;  Log.String( "# Debugging.TraceBack #" );
 		Log.Ln;  Log.String( "#######################" );
-		Log.Ln;  Reflection.StackTraceBack( Log, eip, ebp, stackhigh, TRUE , FALSE );
+		Log.Ln;  Reflection.StackTraceBack( Log, eip, ebp, stacklow, stackhigh, TRUE , FALSE );
 		Log.Update;
 	END TraceBackThis;
 
 	PROCEDURE TraceBack*;   (* do a stack trace back starting at the calling instruction position *)
 	BEGIN
 		Enter;
-		TraceBackThis( Machine.CurrentPC(), Machine.CurrentBP(), Objects.GetStackBottom(Objects.CurrentProcess()) );
+		TraceBackThis( Machine.CurrentPC(), Machine.CurrentBP(), Machine.CurrentSP(), Objects.GetStackBottom(Objects.CurrentProcess()) );
 		Exit;
 	END TraceBack;
 

+ 5 - 5
source/Generic.Reflection.Mod

@@ -818,22 +818,22 @@ CONST
 	
 
 	(* Display call trackback. *)
-	PROCEDURE StackTraceBack*(w: Streams.Writer; pc, bp: ADDRESS; stackhigh: ADDRESS; long, overflow: BOOLEAN);
+	PROCEDURE StackTraceBack*(w: Streams.Writer; pc, bp: ADDRESS; low,high: ADDRESS; long, overflow: BOOLEAN);
 	VAR count,offset: LONGINT; stacklow: ADDRESS; base: ADDRESS; m: Modules.Module; refs: Modules.Bytes;
 	BEGIN
 		count := 0;	(* frame count *)
-		stacklow := bp;
+		low := bp;
 		REPEAT
 			m := Modules.ThisModuleByAdr0(pc);
-			IF (ShowAllProcs OR (m # NIL) OR (count = 0)) & (bp # 0) & (bp >= stacklow) & (bp <= stackhigh) THEN
+			IF (ShowAllProcs OR (m # NIL) OR (count = 0)) & (bp # 0) & (bp >= low) & (bp <= high) THEN
 				IF CheckHeapAddress( pc ) THEN
 					WriteProc0(w, m, pc, bp, refs, offset, base); w.Ln;Wait(w); w.Update;
 					IF long & (~overflow OR (count > 0)) THEN	(* show variables *)
 						IF offset >= 0 THEN 
-							WriteVariables(w,refs,offset, stacklow, stackhigh, base); 
+							WriteVariables(w,refs,offset, base, low, high); 
 							SkipType(refs, offset);
 							IF Expect(GetChar(refs, offset) = sfScopeBegin) THEN
-								WriteVariables(w,refs,offset, base, stacklow, stackhigh); 
+								WriteVariables(w,refs,offset, base, low, high); 
 							END;
 						END;
 						IF (m # NIL) & (base # m.sb) & (count = 0) THEN ModuleState(w, m) END

+ 1 - 1
source/PCM.Mod

@@ -335,7 +335,7 @@ IMPORT
 		log.Ln;  log.String( "##################" );
 		log.Ln;  log.String( "# Debugging.TraceBack #" );
 		log.Ln;  log.String( "##################" );
-		log.Ln;  Reflection.StackTraceBack( log, eip, ebp, 0, TRUE , FALSE );
+		log.Ln;  Reflection.StackTraceBack( log, eip, ebp, ebp, 0, TRUE , FALSE );
 		log.Update;
 	END TraceBackThis;
 

+ 1 - 1
source/ProcessInfo.Mod

@@ -177,7 +177,7 @@ BEGIN
 	out.String("Flags: "); WriteFlags(p.flags, out); out.Ln;
 
 	out.String("Stack Trace Back:"); out.Ln; out.Update;
-	Reflection.StackTraceBack(out, p.state.PC, p.state.BP, Objects.GetStackBottom(p), TRUE, FALSE);
+	Reflection.StackTraceBack(out, p.state.PC, p.state.BP, p.state.SP, Objects.GetStackBottom(p), TRUE, FALSE);
 	out.Ln; out.Update;
 END ShowStack;
 

+ 2 - 3
source/Reflection.Mod

@@ -568,11 +568,10 @@ VAR
 	END WriteSimpleVar;
 
 	(* Display call trackback. *)
-	PROCEDURE StackTraceBack*(w: Streams.Writer; pc, bp: ADDRESS; stackhigh: ADDRESS; long, overflow: BOOLEAN);
-	VAR count,refpos: LONGINT; stacklow: ADDRESS; base: ADDRESS; m: Modules.Module; refs: Modules.Bytes;
+	PROCEDURE StackTraceBack*(w: Streams.Writer; pc, bp: ADDRESS; stacklow, stackhigh: ADDRESS; long, overflow: BOOLEAN);
+	VAR count,refpos: LONGINT; base: ADDRESS; m: Modules.Module; refs: Modules.Bytes;
 	BEGIN
 		count := 0;	(* frame count *)
-		stacklow := bp;
 		REPEAT
 			m := Modules.ThisModuleByAdr0(pc);
 			IF (ShowAllProcs OR (m # NIL) OR (count = 0)) & (bp # 0) & (bp >= stacklow) & (bp <= stackhigh) THEN

+ 1 - 1
source/Traps.Mod

@@ -123,7 +123,7 @@ VAR
 				KernelLog.Memory(int.ESP-16, 64)	(* show stack *)
 			END;*)
 			w.String( "StackTraceBack:" );  w.Ln;
-			Reflection.StackTraceBack(w, int.PC, int.BP, Objects.GetStackBottom(p), long, overflow);
+			Reflection.StackTraceBack(w, int.PC, int.BP, int.SP, Objects.GetStackBottom(p), long, overflow);
 		END;
 		w.String("---------------------------------"); w.Ln;
 		w.Char(02X);	(* "end of trap" *)

+ 1 - 1
source/Win32.Traps.Mod

@@ -209,7 +209,7 @@ VAR
 				(*ALEX 2005.12.08 when calling a pointer to a function and the pointer is NULL meaning eip=NULL*)
 			IF int.PC = 0 THEN SYSTEM.GET( int.SP, pc ) ELSE pc := int.PC END;
 			w.String( "StackTraceBack:" );  w.Ln;
-			Reflection.StackTraceBack( w, pc, int.BP, Objects.GetStackBottom(p), long, overflow )
+			Reflection.StackTraceBack( w, pc, int.BP, int.SP, Objects.GetStackBottom(p), long, overflow )
 		END;
 		w.String("---------------------------------"); w.Ln;
 		w.Char(02X);	(* "end of trap" *)