gdb 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9b16e3cec333997d16a2400dacc343110aec6a4
4
- data.tar.gz: dc486d72d111cfaeac7928402ee1e39a57552bd1
3
+ metadata.gz: de69fa7d5ddc398f6e0bdd176061f23bd650acba
4
+ data.tar.gz: 5d86b5bafafa5d321226633751375a3faf9513fd
5
5
  SHA512:
6
- metadata.gz: 3e8c780fe48de70df13df78fb9f987afab66d268f6f4b27b85665279f4fed43abdc512806a7b7467e77006f5e8c95f2069532fa717134503568c3f65842b9dbb
7
- data.tar.gz: 92dda6f5248627108645bc55c9e3d5a3f7d476bfa2cc3295e4edc7a53e2815ca9f488712109422608fca88fdb29c9f0edec7ad8f8b88647fbf85b5007e277770
6
+ metadata.gz: 0a534be09b10af62159decf1793bad3c977680b9885bd4de3af3c70211d6319d3fde4720e1079d26f83e57dc2518af2f8b3ac9c0f7fac7454715705069f25d43
7
+ data.tar.gz: 40b8085db8abb15a5d2564b6fc4d43c185ccf21d9fa799f93e48dbb669289a2dbdb34aaf254c963351c16ce93beacf0c7badc188e3a6afbeece41bb12cc59401
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  [![Build Status](https://travis-ci.org/david942j/gdb-ruby.svg?branch=master)](https://travis-ci.org/david942j/gdb-ruby)
2
+ [![Gem Version](https://badge.fury.io/rb/gdb.svg)](https://badge.fury.io/rb/gdb)
2
3
  [![Code Climate](https://codeclimate.com/github/david942j/gdb-ruby/badges/gpa.svg)](https://codeclimate.com/github/david942j/gdb-ruby)
3
4
  [![Issue Count](https://codeclimate.com/github/david942j/gdb-ruby/badges/issue_count.svg)](https://codeclimate.com/github/david942j/gdb-ruby)
4
5
  [![Test Coverage](https://codeclimate.com/github/david942j/gdb-ruby/badges/coverage.svg)](https://codeclimate.com/github/david942j/gdb-ruby/coverage)
@@ -3,4 +3,7 @@
3
3
  require 'gdb'
4
4
  require 'shellwords'
5
5
 
6
- GDB::GDB.new(Shellwords.join(ARGV)).interact
6
+ argv = Shellwords.join(ARGV)
7
+ Process.setproctitle('gdb-ruby ' + argv)
8
+
9
+ GDB::GDB.new(argv).interact
@@ -3,8 +3,16 @@ require 'pry'
3
3
  module GDB
4
4
  # For evaluation ruby code in gdb.
5
5
  class EvalContext
6
- attr_reader :gdb # @return [GDB::GDB]
6
+ # @return [GDB::GDB] The gdb instance.
7
+ attr_reader :gdb
7
8
 
9
+ # Instantiate a {EvalContext} object.
10
+ #
11
+ # Each {GDB::GDB} should have exactly one {EvalContext}
12
+ # for evaluating Ruby.
13
+ #
14
+ # @param [GDB::GDB] gdb
15
+ # The gdb instance.
8
16
  def initialize(gdb)
9
17
  @gdb = gdb
10
18
  end
@@ -13,11 +13,23 @@ module GDB
13
13
  # Absolute path to python scripts.
14
14
  SCRIPTS_PATH = File.join(__dir__, 'scripts').freeze
15
15
 
16
+ # To launch a gdb instance.
17
+ #
18
+ # @param [String] arguments
19
+ # The command line arguments to pass to gdb. See examples.
20
+ #
21
+ # @param [String] gdb
22
+ # Name of gdb.
23
+ #
24
+ # @example
25
+ # gdb = GDB::GDB.new('-q -nh bash')
26
+ # gdb = GDB::GDB.new('arm.elf', gdb: 'gdb-multiarch')
16
27
  def initialize(arguments, gdb: 'gdb')
17
28
  arguments = "--command=#{File.join(SCRIPTS_PATH, 'gdbinit.py')}" + ' ' + arguments # XXX
18
29
  @tube = spawn(gdb + ' ' + arguments)
19
- @prompt = '(gdb-ruby) '
20
- @tube.unget(@tube.readuntil(@prompt))
30
+ pre = @tube.readuntil('GDBRuby:')
31
+ @prompt = @tube.readuntil("\n").strip
32
+ @tube.unget(pre + @tube.readuntil(@prompt))
21
33
  end
22
34
 
23
35
  # Execute a command in gdb.
@@ -237,6 +249,9 @@ module GDB
237
249
 
238
250
  private
239
251
 
252
+ # Raise {GDBError} if process is not running.
253
+ #
254
+ # @return [nil]
240
255
  def check_alive!
241
256
  raise GDBError, 'Process is not running' unless alive?
242
257
  end
@@ -255,10 +270,12 @@ module GDB
255
270
  #
256
271
  # @return [String]
257
272
  def output_hook(output)
258
- return output.gsub(@prompt, '') unless output.start_with?(COMMAND_PREFIX)
273
+ idx = output.index(COMMAND_PREFIX)
274
+ return yield output.gsub(@prompt, '') if idx.nil?
275
+ yield output.slice!(0, idx)
259
276
  cmd, args = output.slice(COMMAND_PREFIX.size..-1).split(' ', 2)
260
277
  # only support ruby and pry now.
261
- return output unless %w[ruby pry].include?(cmd)
278
+ return yield output unless %w[ruby pry].include?(cmd)
262
279
  args = 'send(:invoke_pry)' if cmd == 'pry'
263
280
  # gdb by default set tty
264
281
  # hack it
@@ -268,6 +285,8 @@ module GDB
268
285
  rescue StandardError, ScriptError => e
269
286
  $stdout.puts("#{e.class}: #{e}")
270
287
  end
288
+ @tube.puts('END')
289
+ @tube.readuntil(@prompt)
271
290
  nil
272
291
  end
273
292
 
@@ -1,5 +1,8 @@
1
1
  import gdb
2
- import signal
2
+
3
+ import random
4
+ import string
5
+ import sys
3
6
 
4
7
  class GDBRuby():
5
8
  def __init__(self):
@@ -11,6 +14,7 @@ class GDBRuby():
11
14
  gdb.execute("set print elements 0")
12
15
  gdb.execute("set print pretty on")
13
16
  self.hook_gdb_prompt()
17
+ print('GDBRuby:' + self.gdbruby_prompt)
14
18
 
15
19
  '''
16
20
  Hook gdb prompt
@@ -18,18 +22,22 @@ class GDBRuby():
18
22
  def hook_gdb_prompt(self):
19
23
  # don't hook twice
20
24
  if gdb.prompt_hook == self._prompt_hook: return
25
+ self.gdbruby_prompt = self._gen_prompt()
21
26
  self._original_hook = gdb.prompt_hook
22
27
  gdb.prompt_hook = self._prompt_hook
23
28
 
24
- def resume_prompt(self):
25
- gdb.prompt_hook = self._original_hook
29
+ # private
26
30
 
27
31
  def _prompt_hook(self, current_prompt):
28
32
  if self._original_hook == None:
29
- org = '(gdb) '
33
+ org = current_prompt.replace(self.gdbruby_prompt, '')
30
34
  else:
31
35
  org = self._original_hook(current_prompt)
32
- return '(gdb-ruby) ' + org
36
+ return self.gdbruby_prompt + org
37
+
38
+ def _gen_prompt(self):
39
+ rnd = ''.join([random.choice(string.ascii_lowercase) for i in range(8)])
40
+ return '(gdb-ruby-%s)' % rnd
33
41
 
34
42
  __commands__ = []
35
43
  def register_command(cls):
@@ -46,6 +54,15 @@ class GDBRubyCommand(gdb.Command):
46
54
 
47
55
  def invoke(self, args, _from_tty):
48
56
  print("gdb-ruby> " + self.klass._cmdline_ + ' ' + args)
57
+ while True:
58
+ cmd = raw_input() if sys.version_info.major == 2 else input()
59
+ if cmd == 'END':
60
+ break
61
+ try:
62
+ res = gdb.execute(cmd, from_tty=True, to_string=True)
63
+ except gdb.error as e:
64
+ res = str(e)
65
+ sys.stdout.write(res + gdbruby.gdbruby_prompt)
49
66
 
50
67
  @register_command
51
68
  class RubyCommand():
@@ -8,8 +8,12 @@ module GDB
8
8
  # Batch read size.
9
9
  READ_SIZE = 4096
10
10
 
11
+ # Instantiate a {Tube::Tube} object.
12
+ #
11
13
  # @param [IO] io_in
14
+ # Input.
12
15
  # @param [IO] io_out
16
+ # Output.
13
17
  def initialize(io_in, io_out)
14
18
  @in = io_in
15
19
  @out = io_out
@@ -66,10 +70,14 @@ module GDB
66
70
  # Enter interactive mode.
67
71
  #
68
72
  # @param [Proc] output_hook
69
- # Called before flush the output to +$stdout+.
73
+ # String received from output would be passed into this proc.
74
+ # Only data yielded by this proc would be flushed to +$stdout+.
75
+ #
76
+ # Use <tt>lambda { |s, &block| block.call(s) }</tt> or +:tap.to_proc+ (since Ruby 2.2)
77
+ # for a do-nothing hook.
70
78
  #
71
79
  # @return [void]
72
- def interact(output_hook = nil)
80
+ def interact(output_hook)
73
81
  @out.ungetc(@buffer.get)
74
82
  loop do
75
83
  io, = IO.select([$stdin, @out])
@@ -77,8 +85,7 @@ module GDB
77
85
  next unless io.include?(@out)
78
86
  begin
79
87
  recv = @out.readpartial(READ_SIZE)
80
- recv = output_hook.call(recv) if output_hook
81
- $stdout.write(recv) if recv
88
+ output_hook.call(recv) { |str| $stdout.write(str) }
82
89
  @out.ungetc(@buffer.get) unless @buffer.empty?
83
90
  rescue Errno::EIO
84
91
  break
@@ -1,4 +1,4 @@
1
1
  module GDB
2
2
  # The current version of GDB.
3
- VERSION = '0.2.0'.freeze
3
+ VERSION = '0.2.1'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - david942j
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-06 00:00:00.000000000 Z
11
+ date: 2017-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
149
  version: '0'
150
150
  requirements: []
151
151
  rubyforge_project:
152
- rubygems_version: 2.6.10
152
+ rubygems_version: 2.5.2
153
153
  signing_key:
154
154
  specification_version: 4
155
155
  summary: GDB Ruby-binding and Ruby command in GDB