Difference between revisions of "Interfacing the Debugger"

m (Introduction)
m (Requirements on the runtime)
Line 12: Line 12:
 
* Resume the execution.
 
* Resume the execution.
 
* Give information about variables on the stack or heap.
 
* Give information about variables on the stack or heap.
* ...
 
 
  
 +
The runtime thus needs to be able to inspect the C stack and make the transition between the two states executing and communicating.
  
  

Revision as of 05:01, 21 January 2007

Warning.png Warning: Warning: Article under development

Introduction

EiffelStudio supports a rich debugging feature set for workbench code. Finalized systems can only be debugged at the C level.

Requirements on the runtime

When a program is being debugged it is either executing or communicating with the debug daemon. For the latter it is waiting for commands from the daemon (over an inter process communication mechanism) and executing them. Some of those commands are:

  • Proceed to the next breakpoint.
  • Proceed to the next breakpoint slot.
  • Stop the execution.
  • Resume the execution.
  • Give information about variables on the stack or heap.

The runtime thus needs to be able to inspect the C stack and make the transition between the two states executing and communicating.


/* foo */
 
EIF_BOOLEAN Fadkw7f (EIF_REFERENCE Current, 
                     EIF_REFERENCE arg1, 
                     EIF_REFERENCE arg2)
{
   EIF_INTEGER_32 loc1 = (EIF_INTEGER_32) 0;
   EIF_BOOLEAN Result = (EIF_BOOLEAN) 0;
   ...
 
   /*Load locals onto the debuggers stack (cop_stack):*/
   RTLU (SK_BOOL, &Result); 
   RTLU(SK_REF,&arg1);
   RTLU(SK_REF,&arg2);
   RTLU (SK_REF, &Current);
   RTLU(SK_INT32, &loc1);
   ...
   RTHOOK(1);  //Signal debugger, breakpoint slot 1 reached
   loc1 = (EIF_INTEGER_32)((EIF_INTEGER_32) 10L);
   RTHOOK(2);  //Signal debugger, breakpoint slot 2 reached
   tp1 = (FUNCTION_CAST(EIF_REFERENCE, (EIF_REFERENCE)) 
      RTVF(100, 33, "first", arg1))(arg1);
   RTNHOOK(2); //Signal debugger, nested breakpoint slot
   tp2 = RTCCL(arg2);
   (FUNCTION_CAST(void, (EIF_REFERENCE, EIF_REFERENCE)) 
      RTVF(100, 39, "force", tp1))(tp1, tp2);
   RTHOOK(3);  //Signal debugger, breakpoint slot 3 reached
   Result = (EIF_BOOLEAN)(EIF_BOOLEAN) 1;
   RTHOOK(4);  //Signal debugger, breakpoint slot 4 reached
   RTLO(5);    //Pop the five locals from the debuggers stack
 
   return Result;
}