ragweed 0.2.0.pre3-java → 0.2.1-java

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0.pre3
1
+ 0.2.1
@@ -312,7 +312,7 @@ class Ragweed::Debugger32
312
312
  def wait
313
313
  self.attach() if not @attached
314
314
 
315
- event = ev = Ragweed::Wrap32::wait_for_debug_event
315
+ @event = ev = Ragweed::Wrap32::wait_for_debug_event
316
316
  return if not ev
317
317
  case ev.code
318
318
  when Ragweed::Wrap32::DebugCodes::CREATE_PROCESS
@@ -415,6 +415,35 @@ class Ragweed::Debuggerosx
415
415
  end
416
416
  end
417
417
 
418
+ # XXX watch this space for an object to hold this information
419
+ # Return a range via mapping name
420
+ def get_mapping_by_name name, exact = true
421
+ ret = []
422
+ IO.popen("vmmap -interleaved #{@pid}") do |pipe|
423
+ pipe.each_line do |line|
424
+ next if pipe.lineno < 5
425
+ break if line == "==== Legend\n"
426
+ rtype, saddr, eaddr, sz, perms, sm, purpose =
427
+ line.scan(/^([[:graph:]]+(?:\s[[:graph:]]+)?)\s+([[:xdigit:]]+)-([[:xdigit:]]+)\s+\[\s+([[:digit:]]+[A-Z])\s*\]\s+([-rwx\/]+)\s+SM=(COW|PRV|NUL|ALI|SHM|ZER|S\/A)\s+(.*)$/).
428
+ first
429
+ if exact && (rtype == name || purpose == name)
430
+ ret << [saddr, eaddr].map{|x| x.to_i(16)}
431
+ elsif rtype.match(name) || purpose.match(name)
432
+ ret << [saddr, eaddr].map{|x| x.to_i(16)}
433
+ end
434
+ end
435
+ end
436
+ ret
437
+ end
438
+
439
+ def get_stack_ranges
440
+ get_mapping_by_name "Stack", false
441
+ end
442
+
443
+ def get_heap_ranges
444
+ get_mapping_by_name "MALLOC", false
445
+ end
446
+
418
447
  private
419
448
 
420
449
  # sets instance automagic options to sane(ish) defaults when not given
@@ -83,18 +83,15 @@ class Ragweed::Debuggertux
83
83
  end
84
84
 
85
85
  def self.find_by_regex(rx)
86
- a = Dir.entries("/proc/")
87
- a.delete_if { |x| x == '.' }
88
- a.delete_if { |x| x == '..' }
89
- a.delete_if { |x| x =~ /[a-z]/i }
90
-
91
- a.each do |x|
92
- f = File.read("/proc/#{x}/cmdline")
93
- if f =~ rx and x.to_i != Process.pid.to_i
94
- return x
86
+ Dir.glob("/proc/*/cmdline").each do |x|
87
+ x.gsub(/^\/proc\/(\d+)\/cmdline$/) do |ln|
88
+ f = File.read(ln)
89
+ if f =~ rx and $1.to_i != ::Process.pid.to_i
90
+ return f
91
+ end
95
92
  end
96
93
  end
97
- return nil
94
+ nil
98
95
  end
99
96
 
100
97
  def install_bps
@@ -134,78 +131,101 @@ class Ragweed::Debuggertux
134
131
  ## key = Start address of region
135
132
  ## value = Size of the region
136
133
  def mapped
137
- @mapped_regions.clear if @mapped_regions
134
+ @mapped_regions.clear if @mapped_regions
138
135
 
139
- File.read("/proc/#{pid}/maps").each_line do |l|
140
- s,e = l.split('-')
141
- e = e.split(' ').first
142
- sz = e.to_i(16) - s.to_i(16)
143
- @mapped_regions.store(s.to_i(16), sz)
136
+ File.open("/proc/#{pid}/maps") do |f|
137
+ f.each_line do |l|
138
+ e = l.split(' ',2).first
139
+ s,e = e.split('-').map{|x| x.to_i(16)}
140
+ sz = e - s
141
+ @mapped_regions.store(s, sz)
144
142
  end
143
+ end
144
+ @mapped_regions
145
145
  end
146
146
 
147
- ## Return a name for a range if possible
147
+ # Return a name for a range if possible. greedy match
148
+ # returns the first found
148
149
  def get_mapping_name(val)
149
- File.read("/proc/#{pid}/maps").each_line do |l|
150
- base = l.split('-').first
151
- max = l[0,17].split('-',2)[1]
152
- if base.to_i(16) <= val && val <= max.to_i(16)
153
- return l.split(' ').last
150
+ File.open("/proc/#{pid}/maps") do |f|
151
+ f.each_line do |l|
152
+ range, perms, offset, dev, inode, pathname = l.chomp.split(" ")
153
+ base, max = range.split('-').map{|x| x.to_i(16)}
154
+ if base <= val && val <= max
155
+ return pathname
154
156
  end
157
+ end
155
158
  end
156
159
  nil
157
160
  end
161
+ alias mapping_name get_mapping_name
158
162
 
159
163
  ## Return a range via mapping name
160
- def get_mapping_by_name(name)
161
- File.read("/proc/#{pid}/maps").each_line do |l|
162
- n = l.split(' ').last
163
- if n == name
164
- base = l.split('-').first
165
- max = l[0,17].split('-',2)[1]
166
- return [base, max]
164
+ def get_mapping_by_name(name, exact = true)
165
+ ret = []
166
+ File.open("/proc/#{pid}/maps") do |f|
167
+ f.each_line do |l|
168
+ range, perms, offset, dev, inode, pathname = l.chomp.split(" ",6)
169
+ base, max = range.split('-').map{|x| x.to_i(16)}
170
+ if pathname
171
+ if exact && pathname == name
172
+ ret << range.split('-').map{|x| x.to_i(16)}
173
+ elsif pathname.match(name)
174
+ ret << range.split('-').map{|x| x.to_i(16)}
175
+ end
167
176
  end
177
+ end
168
178
  end
169
- nil
179
+ ret
170
180
  end
181
+ alias mapping_by_name get_mapping_by_name
171
182
 
172
183
  ## Helper method for retrieving stack range
173
184
  def get_stack_range
174
- return get_mapping_by_name("[stack]")
185
+ get_mapping_by_name('[stack]')
175
186
  end
187
+ alias stack_range get_stack_range
176
188
 
177
189
  ## Helper method for retrieving heap range
178
190
  def get_heap_range
179
- return get_mapping_by_name("[heap]")
191
+ get_mapping_by_name('[heap]')
180
192
  end
193
+ alias heap_range get_heap_range
181
194
 
182
195
  ## Parse procfs and create a hash containing
183
196
  ## a listing of each mapped shared object
184
197
  def self.shared_libraries(p)
198
+ raise "pid is 0" if p.to_i == 0
185
199
 
186
- raise "pid is 0" if p.to_i == 0
187
-
188
- if @shared_objects
189
- @shared_objects.clear
190
- else
191
- @shared_objects = Hash.new
192
- end
200
+ if @shared_objects
201
+ @shared_objects.clear
202
+ else
203
+ @shared_objects = Hash.new
204
+ end
193
205
 
194
- File.read("/proc/#{p}/maps").each_line do |l|
195
- if l =~ /[a-zA-Z0-9].so/ && l =~ /xp /
196
- lib = l.split(' ', 6)
197
- sa = l.split('-', 0)
206
+ File.open("/proc/#{p}/maps") do |f|
207
+ f.each_line do |l|
208
+ if l =~ /[a-zA-Z0-9].so/ && l =~ /xp /
209
+ lib = l.split(' ', 6)
210
+ sa = l.split('-', 0)
198
211
 
199
- if lib[5] =~ /vdso/
200
- next
201
- end
212
+ if lib[5] =~ /vdso/
213
+ next
214
+ end
202
215
 
203
- lib = lib[5].strip
204
- lib.gsub!(/[\s\n]+/, "")
205
- @shared_objects.store(sa[0], lib)
206
- end
216
+ lib = lib[5].strip
217
+ lib.gsub!(/[\s\n]+/, "")
218
+ @shared_objects.store(sa[0], lib)
207
219
  end
208
- return @shared_objects
220
+ end
221
+ end
222
+ @shared_objects
223
+ end
224
+
225
+ # instance method for above
226
+ # returns a hash of the mapped shared libraries
227
+ def shared_libraries
228
+ self.class.shared_libraries(@pid)
209
229
  end
210
230
 
211
231
  ## Search a specific page for a value
@@ -227,15 +247,17 @@ class Ragweed::Debuggertux
227
247
  ## Search the heap for a value
228
248
  def search_heap(val)
229
249
  loc = Array.new
230
- File.read("/proc/#{pid}/maps").each_line do |l|
231
- if l =~ /\[heap\]/
232
- s,e = l.split('-')
233
- e = e.split(' ').first
234
- s = s.to_i(16)
235
- e = e.to_i(16)
236
- sz = e - s
237
- max = s + sz
238
- loc = search_page(s, max, val)
250
+ File.open("/proc/#{pid}/maps") do |f|
251
+ f.each_line do |l|
252
+ if l =~ /\[heap\]/
253
+ s,e = l.split('-')
254
+ e = e.split(' ').first
255
+ s = s.to_i(16)
256
+ e = e.to_i(16)
257
+ sz = e - s
258
+ max = s + sz
259
+ loc = search_page(s, max, val)
260
+ end
239
261
  end
240
262
  end
241
263
  loc
@@ -266,7 +288,7 @@ class Ragweed::Debuggertux
266
288
  end
267
289
 
268
290
  def single_step
269
- on_single_step
291
+ on_single_step
270
292
  ret = Ragweed::Wraptux::ptrace(Ragweed::Wraptux::Ptrace::STEP, @pid, 1, 0)
271
293
  end
272
294
 
@@ -392,14 +414,14 @@ class Ragweed::Debuggertux
392
414
  end
393
415
 
394
416
  def self.threads(pid)
395
- begin
396
- a = Dir.entries("/proc/#{pid}/task/")
397
- rescue
398
- puts "No such PID: #{pid}"
399
- return
400
- end
401
- a.delete_if { |x| x == '.' }
402
- a.delete_if { |x| x == '..' }
417
+ a = []
418
+ begin
419
+ a = Dir.entries("/proc/#{pid}/task/")
420
+ a.delete_if {|x| x == '.' || x == '..'}
421
+ rescue
422
+ puts "No such PID: #{pid}"
423
+ end
424
+ a
403
425
  end
404
426
 
405
427
  def get_registers
@@ -14,7 +14,14 @@ module Ragweed::Wrap32
14
14
  end
15
15
 
16
16
  module PagePermissions
17
+ PAGE_NOACCESS = 0x1
18
+ PAGE_READONLY = 0x2
19
+ PAGE_READWRITE = 0x4
20
+ PAGE_WRITECOPY = 0x8
21
+ PAGE_EXECUTE = 0x10
22
+ PAGE_EXECUTE_READ = 0x20
17
23
  PAGE_EXECUTE_READWRITE = 0x40
24
+ PAGE_EXECUTE_WRITECOPY = 0x80
18
25
  end
19
26
 
20
27
  module ExceptionCodes
@@ -51,6 +58,34 @@ module Ragweed::Wrap32
51
58
  end
52
59
  end
53
60
 
61
+ class Ragweed::Wrap32::StartupInfo < FFI::Struct
62
+ layout :cb, :ulong,
63
+ :reserved, :pointer,
64
+ :desktop, :pointer,
65
+ :title, :pointer,
66
+ :x, :ulong,
67
+ :y, :ulong,
68
+ :xsize, :ulong,
69
+ :ysize, :ulong,
70
+ :xcountchars, :ulong,
71
+ :ycountchars, :ulong,
72
+ :fillattr, :ulong,
73
+ :flags, :ulong,
74
+ :show_window, :short,
75
+ :breserved, :uint16,
76
+ :preserved, :uint8,
77
+ :std_input, :ulong,
78
+ :std_output, :ulong,
79
+ :std_error, :ulong
80
+ end
81
+
82
+ class Ragweed::Wrap32::ProcessInfo < FFI::Struct
83
+ layout :process_handle, :pointer,
84
+ :thread_handle, :pointer,
85
+ :pid, :ulong,
86
+ :thread_id, :ulong
87
+ end
88
+
54
89
  class Ragweed::Wrap32::RipInfo < FFI::Struct
55
90
  include Ragweed::FFIStructInclude
56
91
  layout :error, :ulong,
@@ -117,8 +117,8 @@ module Ragweed::Wrap32
117
117
  attach_function 'DeviceIoControl', [ :long, :long, :pointer, :long, :pointer, :long, :pointer, :pointer ], :long
118
118
  attach_function 'GetOverlappedResult', [ :long, :pointer, :pointer, :long ], :long
119
119
  attach_function 'WaitForMultipleObjects', [ :long, :pointer, :long, :long ], :long
120
- attach_function 'CreateProcessA', [ :pointer, :pointer, :pointer, :pointer, :long, :long, :pointer, :pointer, :pointer, :pointer ], :long
121
- attach_function 'CreateProcessW', [ :pointer, :pointer, :pointer, :pointer, :long, :long, :pointer, :pointer, :pointer, :pointer ], :long
120
+ attach_function 'CreateProcessA', [ :pointer, :pointer, :pointer, :pointer, :bool, :long, :pointer, :pointer, :pointer, :pointer ], :long
121
+ attach_function 'CreateProcessW', [ :pointer, :pointer, :pointer, :pointer, :bool, :long, :pointer, :pointer, :pointer, :pointer ], :long
122
122
 
123
123
  ffi_lib 'ntdll'
124
124
  ffi_convention :stdcall
@@ -92,7 +92,10 @@ module Ragweed::Wraptux::Wait
92
92
  end
93
93
 
94
94
  module Ragweed::Wraptux::PagePermissions
95
+ PROT_NONE = 0x0
95
96
  PROT_READ = 0x1
96
97
  PROT_WRITE = 0x2
97
98
  PROT_EXEC = 0x4
99
+ PROT_GROWSDOWN = 0x01000000
100
+ PROT_GROWSUP = 0x02000000
98
101
  end
data/ragweed.gemspec CHANGED
@@ -5,12 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ragweed}
8
- s.version = "0.2.0.pre3"
9
- s.platform = %q{java}
8
+ s.version = "0.2.1"
10
9
 
11
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
11
  s.authors = ["tduehr", "struct", "tqbf"]
13
- s.date = %q{2011-03-09}
12
+ s.date = %q{2011-04-13}
14
13
  s.description = %q{General debugging tool written in Ruby for OSX/Win32/Linux}
15
14
  s.email = %q{td@matasano.com}
16
15
  s.extra_rdoc_files = [
@@ -28,7 +27,6 @@ Gem::Specification.new do |s|
28
27
  "examples/hook_notepad.rb",
29
28
  "examples/snicker.rb",
30
29
  "examples/tux-example.rb",
31
- "lib/.DS_Store",
32
30
  "lib/ragweed.rb",
33
31
  "lib/ragweed/arena.rb",
34
32
  "lib/ragweed/blocks.rb",
@@ -76,7 +74,7 @@ Gem::Specification.new do |s|
76
74
  s.homepage = %q{http://github.com/tduehr/ragweed}
77
75
  s.rdoc_options = ["--inline-source", "--line-numbers", "--main", "README.rdoc"]
78
76
  s.require_paths = ["lib"]
79
- s.rubygems_version = %q{1.3.6}
77
+ s.rubygems_version = %q{1.5.2}
80
78
  s.summary = %q{Scriptable debugger}
81
79
  s.test_files = [
82
80
  "examples/hittracertux.rb",
@@ -90,13 +88,15 @@ Gem::Specification.new do |s|
90
88
  ]
91
89
 
92
90
  if s.respond_to? :specification_version then
93
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
94
91
  s.specification_version = 3
95
92
 
96
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
93
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
94
+ s.add_runtime_dependency(%q<ffi>, ["~> 1.0"])
97
95
  else
96
+ s.add_dependency(%q<ffi>, ["~> 1.0"])
98
97
  end
99
98
  else
99
+ s.add_dependency(%q<ffi>, ["~> 1.0"])
100
100
  end
101
101
  end
102
102
 
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ragweed
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: true
5
- segments:
6
- - 0
7
- - 2
8
- - 0
9
- - pre3
10
- version: 0.2.0.pre3
4
+ prerelease:
5
+ version: 0.2.1
11
6
  platform: java
12
7
  authors:
13
8
  - tduehr
@@ -17,7 +12,7 @@ autorequire:
17
12
  bindir: bin
18
13
  cert_chain: []
19
14
 
20
- date: 2011-03-09 00:00:00 -06:00
15
+ date: 2011-04-13 00:00:00 -05:00
21
16
  default_executable:
22
17
  dependencies: []
23
18
 
@@ -41,7 +36,6 @@ files:
41
36
  - examples/hook_notepad.rb
42
37
  - examples/snicker.rb
43
38
  - examples/tux-example.rb
44
- - lib/.DS_Store
45
39
  - lib/ragweed.rb
46
40
  - lib/ragweed/arena.rb
47
41
  - lib/ragweed/blocks.rb
@@ -98,25 +92,21 @@ rdoc_options:
98
92
  require_paths:
99
93
  - lib
100
94
  required_ruby_version: !ruby/object:Gem::Requirement
95
+ none: false
101
96
  requirements:
102
97
  - - ">="
103
98
  - !ruby/object:Gem::Version
104
- segments:
105
- - 0
106
99
  version: "0"
107
100
  required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
108
102
  requirements:
109
- - - ">"
103
+ - - ">="
110
104
  - !ruby/object:Gem::Version
111
- segments:
112
- - 1
113
- - 3
114
- - 1
115
- version: 1.3.1
105
+ version: "0"
116
106
  requirements: []
117
107
 
118
108
  rubyforge_project:
119
- rubygems_version: 1.3.6
109
+ rubygems_version: 1.5.1
120
110
  signing_key:
121
111
  specification_version: 3
122
112
  summary: Scriptable debugger
data/lib/.DS_Store DELETED
Binary file