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
trueif 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
-
#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
stepsare made. -
#step_over(steps, frame = nil, force = false) ⇒ Object
Steps over a
stepsnumber of times. -
#stop_frame(frame) ⇒ Object
Stops when a frame with number
frameis activated. -
#step(steps, force = false) ⇒ Object
Stops the current context after a number of
stepsare made. -
#stop_reason ⇒ Object
Returns the reason for the stop.
-
#suspend ⇒ nil
Suspends the thread when it is running.
-
#suspended? ⇒ Boolean
Returns
trueif 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
20 |
# File 'lib/ruby-debug-base.rb', line 20 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.
2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 |
# File 'ext/ruby_debug.c', line 2123 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
1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 |
# File 'ext/ruby_debug.c', line 1855 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).
1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 |
# File 'ext/ruby_debug.c', line 1624 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.
1643 1644 1645 |
# File 'ext/ruby_debug.c', line 1643 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
1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 |
# File 'ext/ruby_debug.c', line 1901 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.
1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 |
# File 'ext/ruby_debug.c', line 1701 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.
1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 |
# File 'ext/ruby_debug.c', line 1661 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.
1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 |
# File 'ext/ruby_debug.c', line 1682 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.
1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 |
# File 'ext/ruby_debug.c', line 1831 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.
1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 |
# File 'ext/ruby_debug.c', line 1661 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.
1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 |
# File 'ext/ruby_debug.c', line 1879 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.
2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 |
# File 'ext/ruby_debug.c', line 2105 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
16 17 18 |
# File 'lib/ruby-debug-base.rb', line 16 def interrupt self.stop_next = 1 end |
#resume ⇒ nil
Resumes the thread from the suspended mode.
2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 |
# File 'ext/ruby_debug.c', line 2047 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.
1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 |
# File 'ext/ruby_debug.c', line 1937 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.
1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 |
# File 'ext/ruby_debug.c', line 1509 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.
1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 |
# File 'ext/ruby_debug.c', line 1539 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.
1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 |
# File 'ext/ruby_debug.c', line 1577 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.
1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 |
# File 'ext/ruby_debug.c', line 1509 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
2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 |
# File 'ext/ruby_debug.c', line 2141 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.
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 |
# File 'ext/ruby_debug.c', line 2010 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.
2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 |
# File 'ext/ruby_debug.c', line 2030 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.
1970 1971 1972 1973 1974 1975 1976 1977 |
# File 'ext/ruby_debug.c', line 1970 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.
1954 1955 1956 1957 1958 1959 1960 1961 1962 |
# File 'ext/ruby_debug.c', line 1954 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.
2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 |
# File 'ext/ruby_debug.c', line 2067 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.
2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 |
# File 'ext/ruby_debug.c', line 2084 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; } |