ruby-debug-base 0.9.3 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,7 +22,7 @@ module Debugger
22
22
  if obj = frame_self(frame)
23
23
  obj.instance_eval code
24
24
  else
25
- eval code
25
+ eval code, TOPLEVEL_BINDING
26
26
  end
27
27
  end
28
28
 
@@ -81,7 +81,7 @@ module Debugger
81
81
  SCRIPT_LINES__[file] = File.readlines(file)
82
82
  end
83
83
 
84
- change_time = test(?M, file)
84
+ change_time = File.stat(file).mtime
85
85
  SCRIPT_TIMESTAMPS__[file] ||= change_time
86
86
  if @reload_source_on_change && SCRIPT_TIMESTAMPS__[file] < change_time
87
87
  SCRIPT_LINES__[file] = File.readlines(file)
@@ -134,18 +134,20 @@ module Debugger
134
134
  # ...
135
135
  # end
136
136
  def post_mortem
137
- raise "Post-mortem is already activated" if self.post_mortem?
138
- self.post_mortem = true
139
137
  if block_given?
138
+ old_post_mortem = self.post_mortem?
140
139
  begin
140
+ self.post_mortem = true
141
141
  yield
142
142
  rescue Exception => exp
143
143
  handle_post_mortem(exp)
144
144
  raise
145
145
  ensure
146
- self.post_mortem = false
146
+ self.post_mortem = old_post_mortem
147
147
  end
148
148
  else
149
+ return if post_mortem?
150
+ self.post_mortem = true
149
151
  debug_at_exit do
150
152
  handle_post_mortem($!) if $! && post_mortem?
151
153
  end
@@ -172,16 +174,14 @@ module Debugger
172
174
  end
173
175
  end
174
176
 
175
- class Exception # :nodoc:
176
- attr_reader :__debug_file, :__debug_line, :__debug_binding, :__debug_context
177
- end
178
-
179
177
  module Kernel
180
178
  #
181
- # Stops the current thread after a number of _steps_ made.
179
+ # Enters the debugger in the current thread after a number of
180
+ # _steps_ made.
182
181
  #
183
182
  def debugger(steps = 1)
184
183
  Debugger.start unless Debugger.started?
184
+ Debugger.run_init_script(StringIO.new)
185
185
  Debugger.current_context.stop_next = steps
186
186
  end
187
187
  alias breakpoint debugger unless respond_to?(:breakpoint)
@@ -190,10 +190,16 @@ module Kernel
190
190
  # Returns a binding of n-th call frame
191
191
  #
192
192
  def binding_n(n = 0)
193
- Debugger.current_context.frame_binding[n+1]
193
+ Debugger.skip do
194
+ Debugger.current_context.frame_binding(n+2)
195
+ end
194
196
  end
195
197
  end
196
198
 
199
+ class Exception # :nodoc:
200
+ attr_reader :__debug_file, :__debug_line, :__debug_binding, :__debug_context
201
+ end
202
+
197
203
  class Module
198
204
  #
199
205
  # Wraps the +meth+ method with Debugger.start {...} block.
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env ruby
2
+ require "test/unit"
3
+
4
+ $: << File.expand_path(File.dirname(__FILE__)) + '/../ext'
5
+ $: << File.expand_path(File.dirname(__FILE__)) + '/../lib'
6
+ require "ruby_debug"
7
+
8
+ # Test of C extension ruby_debug.so
9
+ class TestRubyDebug < Test::Unit::TestCase
10
+ include Debugger
11
+
12
+ # test current_context
13
+ def test_current_context
14
+ assert_equal(false, Debugger.started?,
15
+ "debugger should not initially be started.")
16
+ Debugger.start
17
+ assert(Debugger.started?,
18
+ "debugger should now be started.")
19
+ assert_equal(19, Debugger.current_context.frame_line)
20
+ assert_equal(nil, Debugger.current_context.frame_args_info,
21
+ "no frame args info.")
22
+ assert_equal(Debugger.current_context.frame_file,
23
+ Debugger.current_context.frame_file(0))
24
+ assert_equal("test-ruby-debug-base.rb",
25
+ File.basename(Debugger.current_context.frame_file))
26
+ assert_raises(ArgumentError) {Debugger.current_context.frame_file(1, 2)}
27
+ assert_raises(ArgumentError) {Debugger.current_context.frame_file(10)}
28
+ assert_equal(1, Debugger.current_context.stack_size)
29
+ assert_equal(TestRubyDebug, Debugger.current_context.frame_class)
30
+ assert_equal(false, Debugger.current_context.dead?, "Not dead yet!")
31
+ Debugger.stop
32
+ assert_equal(false, Debugger.started?,
33
+ "Debugger should no longer be started.")
34
+ end
35
+
36
+ # Test initial variables and setting/getting state.
37
+ def test_debugger_base
38
+ assert_equal(false, Debugger.started?,
39
+ "Debugger should not initially be started.")
40
+ Debugger.start
41
+ assert(Debugger.started?,
42
+ "Debugger should now be started.")
43
+ assert_equal(false, Debugger.debug,
44
+ "Debug variable should not be set.")
45
+ assert_equal(false, Debugger.post_mortem?,
46
+ "Post mortem debugging should not be set.")
47
+ a = Debugger.contexts
48
+ assert_equal(1, a.size,
49
+ "There should only be one context.")
50
+ assert_equal(Array, a.class,
51
+ "Context should be an array.")
52
+ Debugger.stop
53
+ assert_equal(false, Debugger.started?,
54
+ "debugger should no longer be started.")
55
+ end
56
+
57
+ # Test breakpoint handling
58
+ def test_breakpoints
59
+ Debugger.start
60
+ assert_equal(0, Debugger.breakpoints.size,
61
+ "There should not be any breakpoints set.")
62
+ brk = Debugger.add_breakpoint(__FILE__, 1)
63
+ assert_equal(Debugger::Breakpoint, brk.class,
64
+ "Breakpoint should have been set and returned.")
65
+ assert_equal(1, Debugger.breakpoints.size,
66
+ "There should now be one breakpoint set.")
67
+ Debugger.remove_breakpoint(0)
68
+ assert_equal(1, Debugger.breakpoints.size,
69
+ "There should still be one breakpoint set.")
70
+ Debugger.remove_breakpoint(1)
71
+ assert_equal(0, Debugger.breakpoints.size,
72
+ "There should no longer be any breakpoints set.")
73
+ Debugger.stop
74
+ end
75
+ end
76
+
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ruby-debug-base
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.9.3
7
- date: 2007-04-27 20:32:40 -04:00
8
- summary: Fast Ruby debugger
6
+ version: 0.10.0
7
+ date: 2007-12-25 00:00:00 -05:00
8
+ summary: Fast Ruby debugger - core component
9
9
  require_paths:
10
10
  - lib
11
11
  email: ksibilev@yahoo.com
12
12
  homepage: http://rubyforge.org/projects/ruby-debug/
13
13
  rubyforge_project: ruby-debug
14
- description: ruby-debug is a fast implementation of the standard Ruby debugger debug.rb. It's implemented by utilizing a new hook Ruby C API.
14
+ description: ruby-debug is a fast implementation of the standard Ruby debugger debug.rb. It is implemented by utilizing a new Ruby C API hook. The core component provides support that front-ends can build on. It provides breakpoint handling, bindings for stack frames among other things.
15
15
  autorequire: ruby-debug-base
16
16
  default_executable:
17
17
  bindir: bin
@@ -29,17 +29,19 @@ post_install_message:
29
29
  authors:
30
30
  - Kent Sibilev
31
31
  files:
32
- - README
33
- - LICENSE
34
- - CHANGES
35
32
  - AUTHORS
33
+ - CHANGES
34
+ - LICENSE
35
+ - README
36
+ - Rakefile
36
37
  - lib/ruby-debug-base.rb
37
- - ext/extconf.rb
38
+ - lib/ChangeLog
39
+ - ext/ChangeLog
38
40
  - ext/ruby_debug.c
39
- - ext/tags
40
- - ext/win32
41
- test_files: []
42
-
41
+ - ext/extconf.rb
42
+ - test/test-ruby-debug-base.rb
43
+ test_files:
44
+ - test/test-ruby-debug-base.rb
43
45
  rdoc_options: []
44
46
 
45
47
  extra_rdoc_files:
data/ext/tags DELETED
@@ -1,118 +0,0 @@
1
- CTX_FL_SET ruby_debug.c /^#define CTX_FL_SET(c,f) do { (c)->flags |= (f); } /
2
- CTX_FL_TEST ruby_debug.c /^#define CTX_FL_TEST(c,f) ((c)->flags & (f))$/
3
- CTX_FL_UNSET ruby_debug.c /^#define CTX_FL_UNSET(c,f) do { (c)->flags &= ~(f);/
4
- FRAME ruby_debug.c /^struct FRAME {$/
5
- FRAME_N ruby_debug.c /^#define FRAME_N(n) (&debug_context->frames[debug_/
6
- Init_breakpoint ruby_debug.c /^Init_breakpoint()$/
7
- Init_context ruby_debug.c /^Init_context()$/
8
- Init_ruby_debug ruby_debug.c /^Init_ruby_debug()$/
9
- RVarmap ruby_debug.c /^struct RVarmap {$/
10
- SCOPE ruby_debug.c /^struct SCOPE {$/
11
- VALUE ruby_debug.c /^ typedef VALUE (*id2ref_func_t)(VALUE, VALUE);$/
12
- add_to_locked ruby_debug.c /^add_to_locked(VALUE thread)$/
13
- bp_type ruby_debug.c /^enum bp_type {BP_POS_TYPE, BP_METHOD_TYPE};$/
14
- breakpoint_expr ruby_debug.c /^breakpoint_expr(VALUE self)$/
15
- breakpoint_id ruby_debug.c /^breakpoint_id(VALUE self)$/
16
- breakpoint_mark ruby_debug.c /^breakpoint_mark(void *data)$/
17
- breakpoint_pos ruby_debug.c /^breakpoint_pos(VALUE self)$/
18
- breakpoint_source ruby_debug.c /^breakpoint_source(VALUE self)$/
19
- call_at_line ruby_debug.c /^call_at_line(VALUE context, debug_context_t *debug/
20
- call_at_line_unprotected ruby_debug.c /^call_at_line_unprotected(VALUE args)$/
21
- check_breakpoint_expression ruby_debug.c /^check_breakpoint_expression(VALUE breakpoint, VALU/
22
- check_breakpoints_by_method ruby_debug.c /^check_breakpoints_by_method(debug_context_t *debug/
23
- check_breakpoints_by_pos ruby_debug.c /^check_breakpoints_by_pos(debug_context_t *debug_co/
24
- check_frame_number ruby_debug.c /^check_frame_number(debug_context_t *debug_context,/
25
- check_thread_contexts ruby_debug.c /^check_thread_contexts()$/
26
- classname_cmp ruby_debug.c /^classname_cmp(VALUE name, VALUE klass)$/
27
- context_copy_locals ruby_debug.c /^context_copy_locals(debug_frame_t *debug_frame)$/
28
- context_dead ruby_debug.c /^context_dead(VALUE self)$/
29
- context_frame_binding ruby_debug.c /^context_frame_binding(VALUE self, VALUE frame)$/
30
- context_frame_file ruby_debug.c /^context_frame_file(VALUE self, VALUE frame)$/
31
- context_frame_id ruby_debug.c /^context_frame_id(VALUE self, VALUE frame)$/
32
- context_frame_line ruby_debug.c /^context_frame_line(VALUE self, VALUE frame)$/
33
- context_frame_locals ruby_debug.c /^context_frame_locals(VALUE self, VALUE frame)$/
34
- context_frame_self ruby_debug.c /^context_frame_self(VALUE self, VALUE frame)$/
35
- context_ignore ruby_debug.c /^context_ignore(VALUE self)$/
36
- context_is_suspended ruby_debug.c /^context_is_suspended(VALUE self)$/
37
- context_resume ruby_debug.c /^context_resume(VALUE self)$/
38
- context_resume_0 ruby_debug.c /^context_resume_0(debug_context_t *debug_context)$/
39
- context_set_tracing ruby_debug.c /^context_set_tracing(VALUE self, VALUE value)$/
40
- context_stack_size ruby_debug.c /^context_stack_size(VALUE self)$/
41
- context_step_over ruby_debug.c /^context_step_over(int argc, VALUE *argv, VALUE sel/
42
- context_stop_frame ruby_debug.c /^context_stop_frame(VALUE self, VALUE frame)$/
43
- context_stop_next ruby_debug.c /^context_stop_next(VALUE self, VALUE steps)$/
44
- context_suspend ruby_debug.c /^context_suspend(VALUE self)$/
45
- context_suspend_0 ruby_debug.c /^context_suspend_0(debug_context_t *debug_context)$/
46
- context_thnum ruby_debug.c /^context_thnum(VALUE self)$/
47
- context_thread ruby_debug.c /^context_thread(VALUE self)$/
48
- context_thread_0 ruby_debug.c /^context_thread_0(debug_context_t *debug_context)$/
49
- context_tracing ruby_debug.c /^context_tracing(VALUE self)$/
50
- create_binding ruby_debug.c /^create_binding(VALUE self)$/
51
- debug_add_breakpoint ruby_debug.c /^debug_add_breakpoint(int argc, VALUE *argv, VALUE /
52
- debug_at_exit ruby_debug.c /^debug_at_exit(VALUE self)$/
53
- debug_at_exit_c ruby_debug.c /^debug_at_exit_c(VALUE proc)$/
54
- debug_at_exit_i ruby_debug.c /^debug_at_exit_i(VALUE proc)$/
55
- debug_breakpoint_t ruby_debug.c /^} debug_breakpoint_t;$/
56
- debug_breakpoints ruby_debug.c /^debug_breakpoints(VALUE self)$/
57
- debug_catchpoint ruby_debug.c /^debug_catchpoint(VALUE self)$/
58
- debug_check_started ruby_debug.c /^debug_check_started()$/
59
- debug_context_create ruby_debug.c /^debug_context_create(VALUE thread)$/
60
- debug_context_dup ruby_debug.c /^debug_context_dup(debug_context_t *debug_context)$/
61
- debug_context_free ruby_debug.c /^debug_context_free(void *data)$/
62
- debug_context_mark ruby_debug.c /^debug_context_mark(void *data)$/
63
- debug_context_t ruby_debug.c /^} debug_context_t;$/
64
- debug_contexts ruby_debug.c /^debug_contexts(VALUE self)$/
65
- debug_current_context ruby_debug.c /^debug_current_context(VALUE self)$/
66
- debug_debug_load ruby_debug.c /^debug_debug_load(VALUE self, VALUE file)$/
67
- debug_event_hook ruby_debug.c /^debug_event_hook(rb_event_t event, NODE *node, VAL/
68
- debug_frame_t ruby_debug.c /^} debug_frame_t;$/
69
- debug_is_started ruby_debug.c /^debug_is_started(VALUE self)$/
70
- debug_keep_frame_binding ruby_debug.c /^debug_keep_frame_binding(VALUE self)$/
71
- debug_last_interrupted ruby_debug.c /^debug_last_interrupted(VALUE self)$/
72
- debug_post_mortem ruby_debug.c /^debug_post_mortem(VALUE self)$/
73
- debug_remove_breakpoint ruby_debug.c /^debug_remove_breakpoint(VALUE self, VALUE id_value/
74
- debug_resume ruby_debug.c /^debug_resume(VALUE self)$/
75
- debug_set_catchpoint ruby_debug.c /^debug_set_catchpoint(VALUE self, VALUE value)$/
76
- debug_set_keep_frame_binding ruby_debug.c /^debug_set_keep_frame_binding(VALUE self, VALUE val/
77
- debug_set_post_mortem ruby_debug.c /^debug_set_post_mortem(VALUE self, VALUE value)$/
78
- debug_set_tracing ruby_debug.c /^debug_set_tracing(VALUE self, VALUE value)$/
79
- debug_skip ruby_debug.c /^debug_skip(VALUE self)$/
80
- debug_start ruby_debug.c /^debug_start(VALUE self)$/
81
- debug_stop ruby_debug.c /^debug_stop(VALUE self)$/
82
- debug_stop_i ruby_debug.c /^debug_stop_i(VALUE self)$/
83
- debug_suspend ruby_debug.c /^debug_suspend(VALUE self)$/
84
- debug_thread_context ruby_debug.c /^debug_thread_context(VALUE self, VALUE thread)$/
85
- debug_thread_inherited ruby_debug.c /^debug_thread_inherited(VALUE klass)$/
86
- debug_tracing ruby_debug.c /^debug_tracing(VALUE self)$/
87
- eval_expression ruby_debug.c /^eval_expression(VALUE args)$/
88
- filename_cmp ruby_debug.c /^filename_cmp(VALUE source, char *file)$/
89
- find_last_context_func ruby_debug.c /^find_last_context_func(VALUE key, VALUE value, VAL/
90
- get_breakpoint_at ruby_debug.c /^get_breakpoint_at(int index) $/
91
- get_event_name ruby_debug.c /^get_event_name(rb_event_t event)$/
92
- get_top_frame ruby_debug.c /^get_top_frame(debug_context_t *debug_context)$/
93
- id2ref ruby_debug.c /^id2ref(VALUE id)$/
94
- id2ref_error ruby_debug.c /^id2ref_error()$/
95
- id2ref_unprotected ruby_debug.c /^id2ref_unprotected(VALUE id)$/
96
- is_in_locked ruby_debug.c /^is_in_locked(VALUE thread_id)$/
97
- is_thread_alive ruby_debug.c /^is_thread_alive(VALUE thread)$/
98
- isdirsep ruby_debug.c /^#define isdirsep(x) ((x) == '\/' || (x) == '\\\\')/
99
- locked_thread_t ruby_debug.c /^} locked_thread_t;$/
100
- min ruby_debug.c /^#define min(x,y) ((x) < (y) ? (x) : (y))$/
101
- ref2id ruby_debug.c /^ref2id(VALUE obj)$/
102
- remove_from_locked ruby_debug.c /^remove_from_locked()$/
103
- ruby_method_ptr ruby_debug.c /^ruby_method_ptr(VALUE class, ID meth_id)$/
104
- save_call_frame ruby_debug.c /^save_call_frame(VALUE self, char *file, int line, /
105
- save_current_position ruby_debug.c /^save_current_position(debug_context_t *debug_conte/
106
- save_top_binding ruby_debug.c /^save_top_binding(debug_context_t *debug_context, V/
107
- set_current_skipped_status ruby_debug.c /^set_current_skipped_status(VALUE status)$/
108
- set_dyna_vars ruby_debug.c /^set_dyna_vars(debug_context_t *debug_context)$/
109
- set_frame_source ruby_debug.c /^set_frame_source(debug_context_t *debug_context, c/
110
- thread_context_lookup ruby_debug.c /^thread_context_lookup(VALUE thread, VALUE *context/
111
- threads_table_check_i ruby_debug.c /^threads_table_check_i(VALUE key, VALUE value, VALU/
112
- threads_table_clear ruby_debug.c /^threads_table_clear(VALUE table)$/
113
- threads_table_clear_i ruby_debug.c /^threads_table_clear_i(VALUE key, VALUE value, VALU/
114
- threads_table_create ruby_debug.c /^threads_table_create()$/
115
- threads_table_free ruby_debug.c /^threads_table_free(void* data)$/
116
- threads_table_mark ruby_debug.c /^threads_table_mark(void* data)$/
117
- threads_table_mark_keyvalue ruby_debug.c /^threads_table_mark_keyvalue(VALUE key, VALUE value/
118
- threads_table_t ruby_debug.c /^} threads_table_t;$/