trepanning 0.1.6 → 1.93.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. data/COPYING +57 -0
  2. data/ChangeLog +585 -736
  3. data/NEWS +26 -12
  4. data/README.md +62 -0
  5. data/Rakefile +15 -9
  6. data/app/breakpoint.rb +11 -12
  7. data/app/complete.rb +14 -14
  8. data/app/core.rb +34 -30
  9. data/app/default.rb +8 -7
  10. data/app/markdown.rb +191 -0
  11. data/app/options.rb +104 -99
  12. data/app/run.rb +9 -1
  13. data/app/util.rb +7 -7
  14. data/bin/trepan +7 -7
  15. data/interface.rb +0 -4
  16. data/interface/user.rb +11 -11
  17. data/io/input.rb +13 -13
  18. data/lib/trepanning.rb +30 -29
  19. data/processor.rb +40 -40
  20. data/processor/command.rb +13 -9
  21. data/processor/command/alias.rb +21 -15
  22. data/processor/command/backtrace.rb +27 -19
  23. data/processor/command/break.rb +24 -21
  24. data/processor/command/complete.rb +5 -2
  25. data/processor/command/condition.rb +14 -9
  26. data/processor/command/debug.rb +8 -8
  27. data/processor/command/down.rb +6 -6
  28. data/processor/command/edit.rb +4 -0
  29. data/processor/command/eval.rb +2 -2
  30. data/processor/command/exit.rb +12 -9
  31. data/processor/command/finish.rb +25 -23
  32. data/processor/command/frame.rb +30 -26
  33. data/processor/command/help.rb +203 -185
  34. data/processor/command/help/{command.txt → command.md} +21 -18
  35. data/processor/command/help/examples.md +20 -0
  36. data/processor/command/help/filename.md +46 -0
  37. data/processor/command/help/location.md +34 -0
  38. data/processor/command/help/suffixes.md +19 -0
  39. data/processor/command/info.rb +6 -4
  40. data/processor/command/info_subcmd/breakpoints.rb +13 -13
  41. data/processor/command/info_subcmd/files.rb +35 -31
  42. data/processor/command/info_subcmd/frame.rb +82 -33
  43. data/processor/command/info_subcmd/macro.rb +1 -1
  44. data/processor/command/info_subcmd/program.rb +8 -5
  45. data/processor/command/info_subcmd/registers.rb +15 -13
  46. data/processor/command/kill.rb +23 -17
  47. data/processor/command/list.rb +63 -56
  48. data/processor/command/macro.rb +45 -28
  49. data/processor/command/next.rb +29 -23
  50. data/processor/command/pp.rb +11 -9
  51. data/processor/command/pr.rb +10 -8
  52. data/processor/command/ps.rb +5 -5
  53. data/processor/command/quit.rb +24 -17
  54. data/processor/command/raise.rb +6 -6
  55. data/processor/command/reload.rb +9 -2
  56. data/processor/command/reload_subcmd/command.rb +4 -4
  57. data/processor/command/restart.rb +9 -4
  58. data/processor/command/save.rb +9 -9
  59. data/processor/command/server.rb +18 -17
  60. data/processor/command/set.rb +8 -6
  61. data/processor/command/set_subcmd/confirm.rb +15 -2
  62. data/processor/command/set_subcmd/different.rb +7 -5
  63. data/processor/command/set_subcmd/highlight.rb +14 -3
  64. data/processor/command/set_subcmd/pc.rb +62 -0
  65. data/processor/command/set_subcmd/sp.rb +8 -2
  66. data/processor/command/shell.rb +25 -23
  67. data/processor/command/show.rb +9 -7
  68. data/processor/command/show_subcmd/confirm.rb +12 -1
  69. data/processor/command/show_subcmd/highlight.rb +13 -3
  70. data/processor/command/source.rb +27 -26
  71. data/processor/command/step.rb +52 -43
  72. data/processor/command/tbreak.rb +9 -4
  73. data/processor/command/unalias.rb +9 -7
  74. data/processor/command/undisplay.rb +11 -7
  75. data/processor/command/up.rb +18 -13
  76. data/processor/command/watchg.rb +20 -17
  77. data/processor/complete.rb +120 -0
  78. data/processor/default.rb +47 -43
  79. data/processor/list.rb +23 -6
  80. data/processor/load_cmds.rb +25 -105
  81. data/processor/location.rb +104 -96
  82. data/processor/mock.rb +12 -12
  83. data/processor/msg.rb +61 -52
  84. data/processor/validate.rb +36 -27
  85. data/test/data/fname-with-blank.right +0 -1
  86. data/test/data/trace-mingw.right +28 -0
  87. data/test/data/trace.right +0 -2
  88. data/test/functional/test-raise.rb +3 -0
  89. data/test/integration/helper.rb +16 -16
  90. data/test/integration/test-debugger-stop.rb +8 -2
  91. data/test/integration/test-quit.rb +16 -15
  92. data/test/integration/test-trace.rb +19 -10
  93. data/test/unit/cmd-helper.rb +4 -1
  94. data/test/unit/test-app-complete.rb +3 -1
  95. data/test/unit/test-app-options.rb +7 -1
  96. data/test/unit/test-app-run.rb +9 -1
  97. data/test/unit/test-cmd-alias.rb +1 -1
  98. data/test/unit/test-cmd-edit.rb +2 -0
  99. data/test/unit/test-cmd-help.rb +10 -5
  100. data/test/unit/test-cmd-parse_list_cmd.rb +3 -3
  101. data/test/unit/test-completion.rb +2 -2
  102. data/test/unit/test-proc-default.rb +34 -0
  103. data/trepanning.gemspec +15 -14
  104. metadata +70 -44
  105. data/README.textile +0 -50
  106. data/processor/command/help/examples.txt +0 -16
  107. data/processor/command/help/filename.txt +0 -40
  108. data/processor/command/help/location.txt +0 -37
  109. data/processor/command/help/suffixes.txt +0 -17
  110. data/processor/command/info_subcmd/registers_subcmd/dfp.rb +0 -28
  111. data/processor/command/info_subcmd/registers_subcmd/lfp.rb +0 -47
  112. data/processor/command/nocache.rb +0 -32
  113. data/processor/command/parsetree.rb +0 -56
data/NEWS CHANGED
@@ -1,3 +1,17 @@
1
+ (1.93.32) Mar 8, 2015
2
+ - Remove reference to threadframe
3
+
4
+ (1.93.31) Mar 8, 2015
5
+
6
+ - Remove threadframe dependency - it's built into patched Ruby
7
+ - add dependencies for coderay and ansi-termcolor
8
+ - More subcommand help converted to markdown format.
9
+
10
+ (1.93.30) Mar 5, 2015
11
+ - Make it work on a patched Ruby 1.9.3 p551
12
+ - include columnize and linecache-tf gems
13
+ - Help text is rendered via redcloth/markdown
14
+
1
15
  (0.1.6) Nov 25, 2012
2
16
  - Make it work on Ruby 1.9.3 p327
3
17
  - Incompatible change: Remove aliases 'd' and 'u' for down and up
@@ -8,7 +22,7 @@
8
22
  - Internal RubyVM::ThreadFrame -> RubyVM::Frame
9
23
 
10
24
  Oct 27, 2011 (0.1.4)
11
- - Add debugger commands:
25
+ - Add debugger commands:
12
26
  * info iv (is in ruby-debug)
13
27
  * info variables (is in ruby-debug)
14
28
  * info locals as alternative to "info variables locals" (is in gdb)
@@ -48,7 +62,7 @@ June 12, 2011 (0.1.3) Fleetwood Release
48
62
  - Add options from ruby-debug:
49
63
  * --cd
50
64
  * --include
51
- * --require
65
+ * --require
52
66
  * --debug
53
67
  - fix bugs, and improve help
54
68
 
@@ -64,7 +78,7 @@ March 15, 2011 (0.1.1)
64
78
  * VM offsets are now specified via @ rather than o or O
65
79
  * Filenames can be quoted and blanks and characters inside escaped
66
80
  - Document command syntax by adding it as a new category with sub help
67
- - More controlled parsing of method names
81
+ - More controlled parsing of method names
68
82
  - Add eval (no args) and eval? to run current source line or source line
69
83
  eval? strips:
70
84
  * leading "if", "elsif", "while", "until" "return" or "case", or "unless"
@@ -72,17 +86,17 @@ March 15, 2011 (0.1.1)
72
86
  - Save and restore some debugger state across a restart
73
87
  - Redo command completion
74
88
  - "disassemble" command: allow disassembly of specified line numbers
75
- - GNU Readline:
76
- * Start GNU readline tab (command) completion.
89
+ - GNU Readline:
90
+ * Start GNU readline tab (command) completion.
77
91
  * Save and restore command history
78
92
  * add --readline and --no-readline options to trepanx
79
93
  - Macros can return more than one command now
80
- - help
94
+ - help
81
95
  * "help macros" shows all macro names
82
96
  * "help aliases" shows all alias names
83
97
  * "help *" lists macros and aliases now
84
98
  - start "info line"
85
- - "info file" has/shows File::stat()'s mtime and ctime
99
+ - "info file" has/shows File::stat()'s mtime and ctime
86
100
  - be able to pass --verbose to ruby to rake
87
101
 
88
102
  Feb 1, 2011 (0.1.0)
@@ -90,7 +104,7 @@ Feb 1, 2011 (0.1.0)
90
104
  * Add Syntax highlighting on Ruby and YARV listings and locations
91
105
  * Section highlighting on some commands; italics on error if term mode
92
106
  * Use ;; to allow multiple debugger commands. Document debugger command syntax
93
- * include data files for debugging custom-require
107
+ * include data files for debugging custom-require
94
108
  * Numerous bug fixes and code cleanups
95
109
 
96
110
  Dec 25, 2010 (0.0.9)
@@ -103,10 +117,10 @@ Dec 10, 2010 (0.0.8) Phel. Mad release
103
117
  * debugger { code here } work better
104
118
  * source -q silences all prompt and debugger messages
105
119
  * Show instruction-sequence options on demand
106
- * Nuke debugger set_restart => true. We now have a more reliable way to
120
+ * Nuke debugger set_restart => true. We now have a more reliable way to
107
121
  do this. Rubinius showing the way here.
108
122
  * Improvements to the "list" command.
109
- * Get/show eval string using rb-threadframe patch
123
+ * Get/show eval string using rb-threadframe patch
110
124
 
111
125
  Oct 27, 2010 (0.0.6)
112
126
 
@@ -122,11 +136,11 @@ First release under the name trepanning
122
136
 
123
137
  * Add gdb-like "directory" command
124
138
  * Add "set max list" to set number of lines to list by default.
125
- * "break line" searches parent instruction sequences in the same file. This
139
+ * "break line" searches parent instruction sequences in the same file. This
126
140
  should allow more line numbers to be breakpointable.
127
141
  * remap file name in custom_requre.rb
128
142
  * Some small bug fixes
129
-
143
+
130
144
  Sept 13, 2010
131
145
 
132
146
  First public (gemcutter) release.
@@ -0,0 +1,62 @@
1
+ The trepanning debugger gdb-like debugger. As such, it is both a high-level and low-level debugger. It is a also a rewrite of *ruby-debug*. But to provide all of the functionality that it has, it requires a patched version of MRI Ruby 1.9.3 or 1.9.2 found the [rb-threadframe project](https://rocky/rb-threadframe). The additional run-time support in the MRI is what gives this some debugger power that you won't find in other MRI 1.9 debuggers.
2
+
3
+ See the [installation instructions](https://github.com/rocky/rb-trepanning/wiki/How-to-Install-rb-trepanning).
4
+
5
+ There is a [google group mailing list](http://groups.google.com/group/ruby-debugger) for Ruby debuggers.
6
+
7
+ If *trepanning* is installed, here is how to run:
8
+
9
+ ```console
10
+ $ trepan ruby-program [program]
11
+ ```
12
+
13
+ If your program needs options of its own:
14
+
15
+ ```console
16
+ $ trepan -- ruby-program [program args...]
17
+ ```
18
+
19
+ If you want to run from the source tree you can do that too:
20
+
21
+ ```console
22
+
23
+ cd place-where-trepan-is-installed
24
+ ./bin/trepan -- ruby-program [program args...]
25
+ ```
26
+
27
+ Running from inside *irb*:
28
+
29
+ ```ruby
30
+ require 'trepanning'
31
+ Trepan.debug { your code }
32
+ ```
33
+
34
+ The return value from Trepan is the return value of the block, i.e. the final value in the block.
35
+
36
+ You can run the same thing inside your Ruby program, but probably you don't want to give a block. Instead, you may want to have debugging start on the next statement in the code:
37
+
38
+ ```ruby
39
+ require 'trepan'
40
+ Trepan.debug # Don't stop here...
41
+ work # but stop here.
42
+ ```
43
+
44
+ The above is really shorthand for something like:
45
+
46
+ ```ruby
47
+ $trepan = Trepan.new
48
+ $trepan.debugger
49
+ ```
50
+
51
+ The global variable *$trepan* set holds debugger settings, such as `autolist` or `autoeval` settings and breakpoint information.
52
+
53
+ Due to the line-event orientation in ruby-debug, it occasionally was convenient to add a synchronous stop in your program. I don't think that will be necessary here, but if you do call to the debugger at the point of the call rather than the subsequent stopping point, set opts[:immediate] to true. Example:
54
+
55
+ ```ruby
56
+
57
+ # ... work, work, work
58
+ mydbg.debugger(:immediate=>true) # enter debugger here
59
+ # ... work, work, work
60
+ ```
61
+
62
+ There is extensive on-line help. Run `help` inside the debugger.
data/Rakefile CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'rubygems'
4
4
 
5
5
  ROOT_DIR = File.dirname(__FILE__)
6
+ GEM_PROG = ENV['GEM_PROG'] || 'gem'
6
7
  Gemspec_filename='trepanning.gemspec'
7
8
  require_relative './app/options'
8
9
 
@@ -15,7 +16,7 @@ desc "Build the gem"
15
16
  task :package=>:gem
16
17
  task :gem=>:gemspec do
17
18
  Dir.chdir(ROOT_DIR) do
18
- sh "gem build #{Gemspec_filename}"
19
+ sh "#{GEM_PROG} build #{Gemspec_filename}"
19
20
  FileUtils.mkdir_p 'pkg'
20
21
  FileUtils.mv gemspec.file_name, 'pkg'
21
22
  end
@@ -24,7 +25,7 @@ end
24
25
  desc 'Install the gem locally'
25
26
  task :install => :gem do
26
27
  Dir.chdir(ROOT_DIR) do
27
- sh %{gem install --local pkg/#{gemspec.file_name}}
28
+ sh %{#{GEM_PROG} install --local pkg/#{gemspec.file_name}}
28
29
  end
29
30
  end
30
31
 
@@ -96,7 +97,7 @@ task :test do
96
97
  e
97
98
  end
98
99
  end.compact
99
-
100
+
100
101
  exceptions.each {|e| puts e;puts e.backtrace }
101
102
  raise 'Test failures' unless exceptions.empty?
102
103
  end
@@ -145,6 +146,11 @@ task :'check:functional' do
145
146
  run_standalone_ruby_file(File.join(%W(#{ROOT_DIR} test functional)))
146
147
  end
147
148
 
149
+ desc 'Run integration tests in standalone mode.'
150
+ task :'check:functional' do
151
+ run_standalone_ruby_file(File.join(%W(#{ROOT_DIR} test ingtegration)))
152
+ end
153
+
148
154
  desc 'Run command parser grammar.'
149
155
  task :'check:cmd_parse' do
150
156
  sh "kpeg --test --debug #{File.join(ROOT_DIR, %w(app cmd_parse.kpeg))}"
@@ -153,12 +159,12 @@ end
153
159
  desc 'Generate command parser.'
154
160
  task :'cmd_parse' do
155
161
  require 'tmpdir'
156
- temp_file =
157
- File.join(Dir.tmpdir,
162
+ temp_file =
163
+ File.join(Dir.tmpdir,
158
164
  Dir::Tmpname.make_tmpname(['cmd_parser_', '.rb'], nil))
159
165
 
160
- sh("kpeg --name CmdParse --verbose --stand-alone " +
161
- "#{File.join(ROOT_DIR, %w(app cmd_parse.kpeg))} " +
166
+ sh("kpeg --name CmdParse --verbose --stand-alone " +
167
+ "#{File.join(ROOT_DIR, %w(app cmd_parse.kpeg))} " +
162
168
  "--output #{temp_file}")
163
169
  end
164
170
 
@@ -188,7 +194,7 @@ Rake::RDocTask.new("rdoc") do |rdoc|
188
194
  rdoc.rdoc_dir = 'doc'
189
195
  rdoc.title = "Trepanning #{Trepan::VERSION} Documentation"
190
196
 
191
- rdoc.rdoc_files.include(%w(lib/*.rb
197
+ rdoc.rdoc_files.include(%w(lib/*.rb
192
198
  app/*.rb intf/*.rb io/*.rb
193
199
  bin/trepan
194
200
  ))
@@ -216,5 +222,5 @@ task :rm_tilde_backups do
216
222
  end
217
223
 
218
224
  desc 'Remove built files'
219
- task :clean => [:clobber_package, :clobber_rdoc, :rm_patch_residue,
225
+ task :clean => [:clobber_package, :clobber_rdoc, :rm_patch_residue,
220
226
  :rm_tilde_backups]
@@ -1,13 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
- # Copyright (C) 2010, 2011 Rocky Bernstein <rockyb@rubyforge.net>
3
- require 'thread_frame'
2
+ # Copyright (C) 2010-2011, 2013, 2015 Rocky Bernstein <rockyb@rubyforge.net>
4
3
 
5
4
  # Breakpoint objects
6
5
  class Trepan
7
6
  class Breakpoint
8
7
  attr_accessor :condition # If non-nil, this is a String to be eval'd
9
8
  # which must be true to enter the debugger
10
- attr_accessor :hits # Fixnum. The number of timea a breakpoint
9
+ attr_accessor :hits # Fixnum. The number of times a breakpoint
11
10
  # has been hit (with a true condition). Do
12
11
  # we want to (also) record hits independent
13
12
  # of the condition?
@@ -19,7 +18,7 @@ class Trepan
19
18
  attr_reader :offset # Fixnum. Offset into an instruction
20
19
  # sequence for the location of the
21
20
  # breakpoint
22
- attr_reader :negate # Boolean. Negate sense of condition. Used in
21
+ attr_reader :negate # Boolean. Negate sense of condition. Used in
23
22
  # break if .. and break unless ..
24
23
  # breakpoint
25
24
  attr_reader :type # String. 'line' if breakpoint requested
@@ -35,20 +34,20 @@ class Trepan
35
34
  :negate => false,
36
35
  :type => 'line',
37
36
  } unless defined?(BRKPT_DEFAULT_SETTINGS)
38
-
37
+
39
38
  def initialize(iseq, offset, opts = {})
40
- raise TypeError,
41
- "#{iseq} is not an instruction sequence" unless
39
+ raise TypeError,
40
+ "#{iseq} is not an instruction sequence" unless
42
41
  iseq.is_a?(RubyVM::InstructionSequence)
43
42
  @iseq = iseq
44
43
 
45
- raise TypeError,
46
- "offset #{offset.inspect} not found in instruction sequence" unless
44
+ raise TypeError,
45
+ "offset #{offset.inspect} not found in instruction sequence" unless
47
46
  iseq.offset2lines(offset)
48
47
  @offset = iseq
49
48
 
50
- raise TypeError,
51
- "type mismatch: #{offset.class} given, Fixnum expected" unless
49
+ raise TypeError,
50
+ "type mismatch: #{offset.class} given, Fixnum expected" unless
52
51
  offset.is_a?(Fixnum)
53
52
  @offset = offset
54
53
 
@@ -60,7 +59,7 @@ class Trepan
60
59
  @hits = 0
61
60
 
62
61
  unless @id
63
- @id = @@next_id
62
+ @id = @@next_id
64
63
  @@next_id += 1
65
64
  end
66
65
  raise RuntimeError,
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
1
+ # Copyright (C) 2011, 2013 Rocky Bernstein <rockyb@rubyforge.net>
2
2
 
3
3
  class Trepan
4
4
 
@@ -12,21 +12,21 @@ class Trepan
12
12
  def complete_token(complete_ary, prefix)
13
13
  complete_ary.select { |cmd| cmd.to_s.start_with?(prefix) }.sort
14
14
  end
15
-
15
+
16
16
  def complete_token_with_next(complete_hash, prefix, cmd_prefix='')
17
17
  result = []
18
- complete_hash.each do |cmd_name, cmd_obj|
19
- result << [cmd_name.to_s[cmd_prefix.size..-1], cmd_obj] if
18
+ complete_hash.each do |cmd_name, cmd_obj|
19
+ result << [cmd_name.to_s[cmd_prefix.size..-1], cmd_obj] if
20
20
  cmd_name.to_s.start_with?(cmd_prefix + prefix)
21
21
  end
22
22
  result.sort{|a, b| a[0] <=> b[0]}
23
23
  end
24
-
24
+
25
25
  # Find all starting matches in Hash +aliases+ that start with +prefix+,
26
26
  # but filter out any matches already in +expanded+.
27
27
  def complete_token_filtered(aliases, prefix, expanded)
28
28
  complete_ary = aliases.keys
29
- complete_ary.select { |cmd|
29
+ complete_ary.select { |cmd|
30
30
  cmd.to_s.start_with?(prefix) && ! expanded.member?(aliases[cmd])}.sort
31
31
  end
32
32
 
@@ -37,31 +37,31 @@ class Trepan
37
37
  complete_ary = aliases.keys
38
38
  expanded_ary = expanded.keys
39
39
  result = []
40
- complete_ary.each do |cmd|
41
- if cmd.to_s.start_with?(prefix) &&
40
+ complete_ary.each do |cmd|
41
+ if cmd.to_s.start_with?(prefix) &&
42
42
  !expanded_ary.member?(aliases[cmd])
43
- result << [cmd, commands[aliases[cmd]]]
43
+ result << [cmd, commands[aliases[cmd]]]
44
44
  end
45
45
  end
46
- result
46
+ result.sort
47
47
  end
48
48
 
49
49
  # Find the next token in str string from start_pos, we return
50
- # the token and the next blank position after the token or
50
+ # the token and the next blank position after the token or
51
51
  # str.size if this is the last token. Tokens are delimited by
52
52
  # white space.
53
53
  def next_token(str, start_pos)
54
54
  look_at = str[start_pos..-1]
55
55
  next_nonblank_pos = start_pos + (look_at =~ /\S/ || 0)
56
- next_blank_pos =
56
+ next_blank_pos =
57
57
  if next_match = str[next_nonblank_pos..-1] =~ /\s/
58
- next_nonblank_pos + next_match
58
+ next_nonblank_pos + next_match
59
59
  else
60
60
  str.size
61
61
  end
62
62
  return [next_blank_pos, str[next_nonblank_pos...next_blank_pos]]
63
63
  end
64
-
64
+
65
65
  end
66
66
  end
67
67
 
@@ -8,7 +8,7 @@ class Trepan
8
8
  # This class contains the Trepan core routines, such as an event
9
9
  # processor which is responsible of handling what to do when an event is
10
10
  # triggered.
11
- #
11
+ #
12
12
  # See also 'rdbgr' the top-level Trepan class and command-line routine
13
13
  # which ultimately will call this.
14
14
 
@@ -28,24 +28,24 @@ class Trepan
28
28
  attr_accessor :processor # Trepan::CmdProc instance
29
29
  attr_reader :settings # Hash of things you can configure
30
30
  attr_accessor :step_count # Fixnum. Negative means no tracing,
31
- # 0 means stop on next event, 1 means
31
+ # 0 means stop on next event, 1 means
32
32
  # ignore one event. Step events gives the
33
33
  # kind of things to count as a step.
34
- attr_accessor :step_events # bitmask of events - used only when
34
+ attr_accessor :step_events # bitmask of events - used only when
35
35
  # we are stepping
36
- attr_accessor :unmaskable_events
36
+ attr_accessor :unmaskable_events
37
37
 
38
38
  include Trace
39
39
 
40
40
  unless defined?(CORE_DEFAULT_SETTINGS)
41
41
  # Synchronous events
42
- STEPPING_EVENT_MASK =
42
+ STEPPING_EVENT_MASK =
43
43
  LINE_EVENT_MASK | CLASS_EVENT_MASK | CALL_EVENT_MASK |
44
44
  RETURN_EVENT_MASK | C_CALL_EVENT_MASK | C_RETURN_EVENT_MASK |
45
45
  INSN_EVENT_MASK | BRKPT_EVENT_MASK | YIELD_EVENT_MASK |
46
46
  LEAVE_EVENT_MASK | SEND_EVENT_MASK
47
47
 
48
- ASYNC_EVENT_MASK =
48
+ ASYNC_EVENT_MASK =
49
49
  RAISE_EVENT_MASK | VM_EVENT_MASK | SWITCH_EVENT_MASK
50
50
 
51
51
  CORE_DEFAULT_SETTINGS = {
@@ -57,11 +57,11 @@ class Trepan
57
57
 
58
58
  # Not sure what the "right" set really is. The below is just
59
59
  # a guess. Use "set events" or customize in ~/.trepanrc
60
- :step_events =>
60
+ :step_events =>
61
61
  # (DEFAULT_EVENT_MASK | INSN_EVENT_MASK) &
62
62
  (DEFAULT_EVENT_MASK ) &
63
63
  ~(C_CALL_EVENT_MASK | C_RETURN_EVENT_MASK | SEND_EVENT_MASK)
64
- }
64
+ }
65
65
 
66
66
  end
67
67
 
@@ -80,6 +80,7 @@ class Trepan
80
80
  @event_proc = self.method(hook_name).to_proc
81
81
  @processor = CmdProcessor.new(self, @settings[:cmdproc_opts])
82
82
  @unmaskable_events = %w(brkpt raise switch vm)
83
+ @current_thread = nil
83
84
  end
84
85
 
85
86
  def step_events_list
@@ -94,15 +95,18 @@ class Trepan
94
95
  def event_processor(event, frame, arg=nil)
95
96
 
96
97
  return_exception = nil
97
- # FIXME: check for breakpoints or other unmaskable events.
98
+ # FIXME: check for breakpoints or other unmaskable events.
98
99
  # For now there are none.
99
100
 
101
+ return if @mutex.locked? and Thread.current == @current_thread
102
+
100
103
  @mutex.synchronize do
104
+ @current_thread = Thread.current
101
105
  @frame = frame
102
106
  while @frame.type == 'IFUNC'
103
107
  @frame = @frame.prev
104
108
  end
105
-
109
+
106
110
  if @step_count > 0
107
111
  @step_count -= 1
108
112
  break
@@ -112,52 +116,52 @@ class Trepan
112
116
 
113
117
  @event = event
114
118
  @hook_arg = arg
115
-
119
+
116
120
  ### debug:
117
121
  ### puts "#{frame.file[1]}:#{frame.source_location[0]}:in `#{frame.method}' #{event}" # if %w(line).member?(event)
118
122
  @processor.process_commands(@frame)
119
-
123
+
120
124
  # FIXME: There should be a Trace.event_mask which should return the first
121
125
  # mask that matches the given trace hook.
122
126
  if @step_count < 0
123
127
  # If we are continuing, no need to stop at stepping events.
124
- Trace.event_masks[0] &= ~STEPPING_EVENT_MASK
128
+ Trace.event_masks[0] &= ~STEPPING_EVENT_MASK
125
129
  else
126
- # Set to trace only those events we are interested in.
127
-
130
+ # Set to trace only those events we are interested in.
131
+
128
132
  # Don't step/trace into Ruby routines called from here in the code
129
133
  # below (e.g. "trace_hooks").
130
134
  step_count_save = step_count
131
- @step_count = -1
132
-
135
+ @step_count = -1
136
+
133
137
  unless @event_proc == dbgr.trace_filter.hook_proc
134
- dbgr.trace_filter.add_trace_func(@event_proc)
138
+ dbgr.trace_filter.add_trace_func(@event_proc)
135
139
  ## debug: p '+++1', @event_proc, dbgr.trace_filter.hook_proc
136
140
  end
137
-
138
- # FIXME: this doesn't work. Bug in rb-trace?
141
+
142
+ # FIXME: this doesn't work. Bug in rb-trace?
139
143
  # Trace.event_masks[0] = @step_events | @async_events
140
- RubyVM::TraceHook::trace_hooks[0].event_mask =
144
+ RubyVM::TraceHook::trace_hooks[0].event_mask =
141
145
  @step_events | @async_events
142
146
  @step_count = step_count_save
143
147
  end
144
-
148
+
145
149
  # Nil out variables just in case...
146
-
150
+
147
151
  return_exception = @exception
148
152
  @frame = @event = @arg = @exception = nil
149
-
153
+
150
154
  end
151
- return return_exception
155
+ return return_exception
152
156
  end
153
157
 
154
- # A Ruby 1.8-style event processor. We don't use file, line, id, bind.
158
+ # A Ruby 1.8-style event processor. We don't use file, line, id, bind.
155
159
  def old_event_processor(event, file, line, id, bind, klass)
156
160
  event_processor(event, RubyVM::Frame.current.prev)
157
161
  end
158
162
 
159
163
  # Call this from inside the program you want to get a synchronous
160
- # call to the debugger. set prev_count to the number of levels
164
+ # call to the debugger. set prev_count to the number of levels
161
165
  # *before* the caller you want to skip.
162
166
  def debugger(prev_count=0)
163
167
  while @frame && @frame.type == 'IFUNC'
@@ -167,7 +171,7 @@ class Trepan
167
171
  @step_count = 0 # Make event processor stop
168
172
  event_processor('debugger-call', frame)
169
173
  end
170
-
174
+
171
175
  # A trace-hook processor for 'trace var'
172
176
  def trace_var_processor(var_name, value)
173
177
  frame = RubyVM::Frame.current.prev(2)
@@ -178,8 +182,8 @@ class Trepan
178
182
  end
179
183
 
180
184
  # Stop future tracing into the debugger
181
- Thread.current.tracing = true
182
-
185
+ Thread.current.tracing = true
186
+
183
187
  @step_count = 0 # Make event processor stop
184
188
  event_processor('trace-var', frame, [var_name, value])
185
189
  end