Class: Debugger::Context
- Inherits:
-
Object
- Object
- Debugger::Context
- Defined in:
- lib/ruby-debug-base.rb,
ext/ruby_debug.c
Instance Method Summary collapse
- #__c_frame_binding ⇒ Object
-
#breakpoint ⇒ Breakpoint
Returns a context-specific temporary Breakpoint object.
-
#dead? ⇒ Boolean
Returns
true
if context doesn’t represent a live context and is created during post-mortem exception handling. -
#frame_args(frame_position = 0) ⇒ Object
Returns frame’s argument parameters.
-
#frame_args_info(*args) ⇒ Object
Returns info saved about call arguments (if any saved).
-
#frame_binding(frame_position = 0) ⇒ Binding
Returns frame’s binding.
-
#frame_class(frame_position) ⇒ Object
Returns the real class of the frame.
-
#frame_file(frame_position) ⇒ String
Returns the name of the file.
-
#frame_method(frame_position = 0) ⇒ Object
Returns the sym of the called method.
-
#frame_line(frame_position) ⇒ Integer
Returns the line number in the file.
-
#frame_locals(frame) ⇒ Hash
Returns frame’s local variables.
-
#frame_method(frame_position = 0) ⇒ Object
Returns the sym of the called method.
-
#frame_self(frame_postion = 0) ⇒ Object
Returns self object of the frame.
-
#ignored? ⇒ Boolean
Returns the ignore flag for the current context.
- #interrupt ⇒ Object
-
#break ⇒ Boolean
Returns
true
if context is currently running and set flag to break it at next line. -
#resume ⇒ nil
Resumes the thread from the suspended mode.
-
#set_breakpoint(source, pos, condition = nil) ⇒ Object
Sets a context-specific temporary breakpoint, which can be used to implement ‘Run to Cursor’ debugger function.
-
#stack_size ⇒ Object
Returns the size of the context stack.
-
#step(steps, force = false) ⇒ Object
Stops the current context after a number of
steps
are made. -
#step_over(steps, frame = nil, force = false) ⇒ Object
Steps over a
steps
number of times. -
#stop_frame(frame) ⇒ Object
Stops when a frame with number
frame
is activated. -
#step(steps, force = false) ⇒ Object
Stops the current context after a number of
steps
are made. -
#stop_reason ⇒ Object
Returns the reason for the stop.
-
#suspend ⇒ nil
Suspends the thread when it is running.
-
#suspended? ⇒ Boolean
Returns
true
if the thread is suspended by debugger. -
#thnum ⇒ Integer
Returns the context’s number.
-
#thread ⇒ Object
Returns a thread this context is associated with.
-
#tracing ⇒ Boolean
Returns the tracing flag for the current context.
-
#tracing=(bool) ⇒ Object
Controls the tracing for this context.
Instance Method Details
#__c_frame_binding ⇒ Object
19 |
# File 'lib/ruby-debug-base.rb', line 19 alias __c_frame_binding frame_binding |
#breakpoint ⇒ Breakpoint
Returns a context-specific temporary Breakpoint object.
263 264 265 266 267 268 269 270 271 272 |
# File 'ext/breakpoint.c', line 263
VALUE
context_breakpoint(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
return debug_context->breakpoint;
}
|
#dead? ⇒ Boolean
Returns true
if context doesn’t represent a live context and is created during post-mortem exception handling.
2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 |
# File 'ext/ruby_debug.c', line 2158
static VALUE
context_dead(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
return CTX_FL_TEST(debug_context, CTX_FL_DEAD) ? Qtrue : Qfalse;
}
|
#frame_args(frame_position = 0) ⇒ Object
Returns frame’s argument parameters
1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 |
# File 'ext/ruby_debug.c', line 1890
static VALUE
context_frame_args(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
debug_frame_t *debug_frame;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
debug_frame = GET_FRAME;
if(debug_frame->dead)
return debug_frame->info.copy.args;
else
return context_copy_args(debug_frame);
}
|
#frame_args_info(frame_position = 0) ⇒ Object #track_frame_args ⇒ Object
Returns info saved about call arguments (if any saved).
1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 |
# File 'ext/ruby_debug.c', line 1659
static VALUE
context_frame_args_info(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
return RTEST(track_frame_args) ? GET_FRAME->arg_ary : Qnil;
}
|
#frame_binding(frame_position = 0) ⇒ Binding
Returns frame’s binding.
1678 1679 1680 |
# File 'ext/ruby_debug.c', line 1678 def frame_binding(frame) __c_frame_binding(frame) || hbinding(frame) end |
#frame_class(frame_position) ⇒ Object
Returns the real class of the frame. It could be different than context.frame_self(frame).class
1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 |
# File 'ext/ruby_debug.c', line 1936
static VALUE
context_frame_class(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
debug_frame_t *debug_frame;
VALUE klass;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
debug_frame = GET_FRAME;
if(CTX_FL_TEST(debug_context, CTX_FL_DEAD))
return Qnil;
#if RUBY_VERSION_CODE >= 190
klass = debug_frame->info.runtime.frame->this_class;
#else
klass = debug_frame->info.runtime.frame->last_class;
#endif
klass = real_class(klass);
if(TYPE(klass) == T_CLASS || TYPE(klass) == T_MODULE)
return klass;
return Qnil;
}
|
#frame_file(frame_position) ⇒ String
Returns the name of the file.
1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 |
# File 'ext/ruby_debug.c', line 1736
static VALUE
context_frame_file(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
return rb_str_new2(GET_FRAME->file);
}
|
#frame_method(frame_position = 0) ⇒ Object
Returns the sym of the called method.
1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 |
# File 'ext/ruby_debug.c', line 1696
static VALUE
context_frame_id(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
ID id;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
id = GET_FRAME->id;
return id ? ID2SYM(id): Qnil;
}
|
#frame_line(frame_position) ⇒ Integer
Returns the line number in the file.
1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 |
# File 'ext/ruby_debug.c', line 1717
static VALUE
context_frame_line(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
return INT2FIX(GET_FRAME->line);
}
|
#frame_locals(frame) ⇒ Hash
Returns frame’s local variables.
1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 |
# File 'ext/ruby_debug.c', line 1866
static VALUE
context_frame_locals(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
debug_frame_t *debug_frame;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
debug_frame = GET_FRAME;
if(debug_frame->dead)
return debug_frame->info.copy.locals;
else
return context_copy_locals(debug_frame);
}
|
#frame_method(frame_position = 0) ⇒ Object
Returns the sym of the called method.
1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 |
# File 'ext/ruby_debug.c', line 1696
static VALUE
context_frame_id(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
ID id;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
id = GET_FRAME->id;
return id ? ID2SYM(id): Qnil;
}
|
#frame_self(frame_postion = 0) ⇒ Object
Returns self object of the frame.
1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 |
# File 'ext/ruby_debug.c', line 1914
static VALUE
context_frame_self(int argc, VALUE *argv, VALUE self)
{
VALUE frame;
debug_context_t *debug_context;
debug_frame_t *debug_frame;
debug_check_started();
frame = optional_frame_position(argc, argv);
Data_Get_Struct(self, debug_context_t, debug_context);
debug_frame = GET_FRAME;
return debug_frame->self;
}
|
#ignored? ⇒ Boolean
Returns the ignore flag for the current context.
2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 |
# File 'ext/ruby_debug.c', line 2140
static VALUE
context_ignored(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
return CTX_FL_TEST(debug_context, CTX_FL_IGNORE) ? Qtrue : Qfalse;
}
|
#interrupt ⇒ Object
15 16 17 |
# File 'lib/ruby-debug-base.rb', line 15 def interrupt self.stop_next = 1 end |
#break ⇒ Boolean
Returns true
if context is currently running and set flag to break it at next line
2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 |
# File 'ext/ruby_debug.c', line 2213
static VALUE
context_pause(VALUE self)
{
debug_context_t *debug_context;
VALUE thread;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
if (CTX_FL_TEST(debug_context, CTX_FL_DEAD))
return(Qfalse);
if (context_thread_0(debug_context) == rb_thread_current())
return(Qfalse);
debug_context->thread_pause = 1;
return(Qtrue);
}
|
#resume ⇒ nil
Resumes the thread from the suspended mode.
2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 |
# File 'ext/ruby_debug.c', line 2082
static VALUE
context_resume(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
if(!CTX_FL_TEST(debug_context, CTX_FL_SUSPEND))
rb_raise(rb_eRuntimeError, "Thread is not suspended.");
context_resume_0(debug_context);
return Qnil;
}
|
#set_breakpoint(source, pos, condition = nil) ⇒ Object
Sets a context-specific temporary breakpoint, which can be used to implement ‘Run to Cursor’ debugger function. When this breakpoint is reached, it will be cleared out.
source is a name of a file or a class. pos is a line number or a method name if source is a class name. condition is a string which is evaluated to true
when this breakpoint is activated.
287 288 289 290 291 292 293 294 295 296 297 298 299 |
# File 'ext/breakpoint.c', line 287
VALUE
context_set_breakpoint(int argc, VALUE *argv, VALUE self)
{
VALUE result;
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
result = create_breakpoint_from_args(argc, argv, 0);
debug_context->breakpoint = result;
return result;
}
|
#stack_size ⇒ Object
Returns the size of the context stack.
1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 |
# File 'ext/ruby_debug.c', line 1972
static VALUE
context_stack_size(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
return INT2FIX(debug_context->stack_size);
}
|
#step(steps, force = false) ⇒ Object
Stops the current context after a number of steps
are made. force
parameter (if true) ensures that the cursor moves from the current line.
1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 |
# File 'ext/ruby_debug.c', line 1544
static VALUE
context_stop_next(int argc, VALUE *argv, VALUE self)
{
VALUE steps, force;
debug_context_t *debug_context;
debug_check_started();
rb_scan_args(argc, argv, "11", &steps, &force);
if(FIX2INT(steps) < 0)
rb_raise(rb_eRuntimeError, "Steps argument can't be negative.");
Data_Get_Struct(self, debug_context_t, debug_context);
debug_context->stop_next = FIX2INT(steps);
if(RTEST(force))
CTX_FL_SET(debug_context, CTX_FL_FORCE_MOVE);
else
CTX_FL_UNSET(debug_context, CTX_FL_FORCE_MOVE);
return steps;
}
|
#step_over(steps, frame = nil, force = false) ⇒ Object
Steps over a steps
number of times. Make step over operation on frame
, by default the current frame. force
parameter (if true) ensures that the cursor moves from the current line.
1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 |
# File 'ext/ruby_debug.c', line 1574
static VALUE
context_step_over(int argc, VALUE *argv, VALUE self)
{
VALUE lines, frame, force;
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
if(debug_context->stack_size == 0)
rb_raise(rb_eRuntimeError, "No frames collected.");
rb_scan_args(argc, argv, "12", &lines, &frame, &force);
debug_context->stop_line = FIX2INT(lines);
CTX_FL_UNSET(debug_context, CTX_FL_STEPPED);
if(frame == Qnil)
{
debug_context->dest_frame = debug_context->stack_size;
}
else
{
if(FIX2INT(frame) < 0 && FIX2INT(frame) >= debug_context->stack_size)
rb_raise(rb_eRuntimeError, "Destination frame is out of range.");
debug_context->dest_frame = debug_context->stack_size - FIX2INT(frame);
}
if(RTEST(force))
CTX_FL_SET(debug_context, CTX_FL_FORCE_MOVE);
else
CTX_FL_UNSET(debug_context, CTX_FL_FORCE_MOVE);
return Qnil;
}
|
#stop_frame(frame) ⇒ Object
Stops when a frame with number frame
is activated. Implements finish
and next
commands.
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 |
# File 'ext/ruby_debug.c', line 1612
static VALUE
context_stop_frame(VALUE self, VALUE frame)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
if(FIX2INT(frame) < 0 && FIX2INT(frame) >= debug_context->stack_size)
rb_raise(rb_eRuntimeError, "Stop frame is out of range.");
debug_context->stop_frame = debug_context->stack_size - FIX2INT(frame);
return frame;
}
|
#step(steps, force = false) ⇒ Object
Stops the current context after a number of steps
are made. force
parameter (if true) ensures that the cursor moves from the current line.
1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 |
# File 'ext/ruby_debug.c', line 1544
static VALUE
context_stop_next(int argc, VALUE *argv, VALUE self)
{
VALUE steps, force;
debug_context_t *debug_context;
debug_check_started();
rb_scan_args(argc, argv, "11", &steps, &force);
if(FIX2INT(steps) < 0)
rb_raise(rb_eRuntimeError, "Steps argument can't be negative.");
Data_Get_Struct(self, debug_context_t, debug_context);
debug_context->stop_next = FIX2INT(steps);
if(RTEST(force))
CTX_FL_SET(debug_context, CTX_FL_FORCE_MOVE);
else
CTX_FL_UNSET(debug_context, CTX_FL_FORCE_MOVE);
return steps;
}
|
#stop_reason ⇒ Object
Returns the reason for the stop. It maybe of the following values: :initial, :step, :breakpoint, :catchpoint, :post-mortem
2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 |
# File 'ext/ruby_debug.c', line 2176
static VALUE
context_stop_reason(VALUE self)
{
debug_context_t *debug_context;
char * sym_name;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
switch(debug_context->stop_reason)
{
case CTX_STOP_STEP:
sym_name = "step";
break;
case CTX_STOP_BREAKPOINT:
sym_name = "breakpoint";
break;
case CTX_STOP_CATCHPOINT:
sym_name = "catchpoint";
break;
case CTX_STOP_NONE:
default:
sym_name = "none";
}
if(CTX_FL_TEST(debug_context, CTX_FL_DEAD))
sym_name = "post-mortem";
return ID2SYM(rb_intern(sym_name));
}
|
#suspend ⇒ nil
Suspends the thread when it is running.
2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 |
# File 'ext/ruby_debug.c', line 2045
static VALUE
context_suspend(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
if(CTX_FL_TEST(debug_context, CTX_FL_SUSPEND))
rb_raise(rb_eRuntimeError, "Already suspended.");
context_suspend_0(debug_context);
return Qnil;
}
|
#suspended? ⇒ Boolean
Returns true
if the thread is suspended by debugger.
2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 |
# File 'ext/ruby_debug.c', line 2065
static VALUE
context_is_suspended(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
return CTX_FL_TEST(debug_context, CTX_FL_SUSPEND) ? Qtrue : Qfalse;
}
|
#thnum ⇒ Integer
Returns the context’s number.
2005 2006 2007 2008 2009 2010 2011 2012 |
# File 'ext/ruby_debug.c', line 2005
static VALUE
context_thnum(VALUE self)
{
debug_context_t *debug_context;
Data_Get_Struct(self, debug_context_t, debug_context);
return INT2FIX(debug_context->thnum);
}
|
#thread ⇒ Object
Returns a thread this context is associated with.
1989 1990 1991 1992 1993 1994 1995 1996 1997 |
# File 'ext/ruby_debug.c', line 1989
static VALUE
context_thread(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
return context_thread_0(debug_context);
}
|
#tracing ⇒ Boolean
Returns the tracing flag for the current context.
2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 |
# File 'ext/ruby_debug.c', line 2102
static VALUE
context_tracing(VALUE self)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
return CTX_FL_TEST(debug_context, CTX_FL_TRACING) ? Qtrue : Qfalse;
}
|
#tracing=(bool) ⇒ Object
Controls the tracing for this context.
2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 |
# File 'ext/ruby_debug.c', line 2119
static VALUE
context_set_tracing(VALUE self, VALUE value)
{
debug_context_t *debug_context;
debug_check_started();
Data_Get_Struct(self, debug_context_t, debug_context);
if(RTEST(value))
CTX_FL_SET(debug_context, CTX_FL_TRACING);
else
CTX_FL_UNSET(debug_context, CTX_FL_TRACING);
return value;
}
|