gdb 0.3.0 → 1.0.0
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.
- checksums.yaml +5 -5
- data/README.md +11 -5
- data/bin/gdb-ruby +9 -1
- data/lib/gdb/gdb.rb +80 -23
- data/lib/gdb/scripts/gdbinit.py +12 -1
- data/lib/gdb/tube/buffer.rb +2 -0
- data/lib/gdb/tube/tube.rb +14 -2
- data/lib/gdb/util.rb +35 -0
- data/lib/gdb/version.rb +1 -1
- metadata +22 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: fb429f1309a91731395b1a338e151f3d46431c9e060ffa067cb8cad51320d835
|
4
|
+
data.tar.gz: 249e06ec6ae0497951c7ed958e0da149694e76fc91696d839ebc8c3c6175e4a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fdcb2dd789d8dbf3c29d46d0f0ba5b77373eeac74e4412d8136f65feaeedde0b82d95d48503c05edec8ea8f951264d798a4b99d2458b0833a48b164e032fa61
|
7
|
+
data.tar.gz: '09f569cd9e61aa079d0de7cf498220b010c529c4319f702f4a0d990ebf9714b8bce3f0a811254a2a9d788d6fd9fce8db93402bc1a5e98980cf84739a58c13b23'
|
data/README.md
CHANGED
@@ -8,11 +8,16 @@
|
|
8
8
|
|
9
9
|
# GDB-Ruby
|
10
10
|
|
11
|
-
It's time for Ruby lovers to use Ruby in gdb
|
11
|
+
It's time for Ruby lovers to use Ruby in gdb and, gdb in Ruby!
|
12
|
+
|
13
|
+
Achieve two things in one gem:
|
14
|
+
|
15
|
+
1. Launch Ruby interactive shell (pry) in gdb.
|
16
|
+
2. A gdb Ruby-binding, i.e. communiate with gdb in a Ruby script.
|
12
17
|
|
13
18
|
# Use Ruby in gdb
|
14
19
|
|
15
|
-
We provide a binary `gdb-ruby` with usage exactly same as normal gdb,
|
20
|
+
We provide a binary `gdb-ruby` (a Ruby script actually) with usage exactly same as normal gdb,
|
16
21
|
while has two extra commands: `ruby` and `pry`!
|
17
22
|
|
18
23
|
See examples below:
|
@@ -51,14 +56,14 @@ Example:
|
|
51
56
|
|
52
57
|
## Integrate with other gdb extensions
|
53
58
|
|
54
|
-
Completely NO effort if you want to use **gdb-ruby** with other gdb
|
59
|
+
Completely *NO* effort if you want to use **gdb-ruby** with other gdb extensions.
|
55
60
|
|
56
61
|
For example, I usually use [gef](https://github.com/hugsy/gef) for my gdb.
|
57
62
|
And everything works as usual when integrated with **gdb-ruby**:
|
58
63
|
|
59
64
|
Launching with `$ gdb-ruby -q bash`
|
60
65
|
|
61
|
-

|
62
67
|
|
63
68
|
# Use gdb in Ruby
|
64
69
|
|
@@ -138,6 +143,7 @@ gdb.interact
|
|
138
143
|
# Installation
|
139
144
|
|
140
145
|
Available on RubyGems.org!
|
146
|
+
|
141
147
|
```
|
142
148
|
$ gem install gdb
|
143
149
|
```
|
@@ -158,5 +164,5 @@ Any feature requests and suggestions are welcome! :grimacing:
|
|
158
164
|
|
159
165
|
# Growing up
|
160
166
|
|
161
|
-
**gdb-ruby** is under developing, give it a star and [
|
167
|
+
**gdb-ruby** is under developing, give it a star and [watch](https://github.com/david942j/gdb-ruby/subscription)
|
162
168
|
for latest updates!
|
data/bin/gdb-ruby
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'gdb'
|
4
3
|
require 'shellwords'
|
5
4
|
|
5
|
+
require 'gdb'
|
6
|
+
require 'gdb/util'
|
7
|
+
|
6
8
|
argv = Shellwords.join(ARGV)
|
7
9
|
Process.setproctitle('gdb-ruby ' + argv)
|
8
10
|
|
11
|
+
gdb = ::GDB::Util.find_gdb
|
12
|
+
if gdb.nil?
|
13
|
+
# No gdb installed
|
14
|
+
warn('[ERROR] No gdb installed in your system.')
|
15
|
+
exit 2
|
16
|
+
end
|
9
17
|
GDB::GDB.new(argv).interact
|
data/lib/gdb/gdb.rb
CHANGED
@@ -6,11 +6,16 @@ require 'readline'
|
|
6
6
|
require 'gdb/eval_context'
|
7
7
|
require 'gdb/gdb_error'
|
8
8
|
require 'gdb/tube/tube'
|
9
|
+
require 'gdb/util'
|
9
10
|
|
10
11
|
module GDB
|
11
12
|
# For launching a gdb process.
|
13
|
+
#
|
14
|
+
# @!macro [new] gdb_displayed
|
15
|
+
# @return [String]
|
16
|
+
# Returns what gdb displayed after executing this command.
|
12
17
|
class GDB
|
13
|
-
# Absolute path to python scripts.
|
18
|
+
# Absolute path to the python scripts.
|
14
19
|
SCRIPTS_PATH = File.join(__dir__, 'scripts').freeze
|
15
20
|
|
16
21
|
# To launch a gdb instance.
|
@@ -25,8 +30,11 @@ module GDB
|
|
25
30
|
# gdb = GDB::GDB.new('-q -nh bash')
|
26
31
|
# gdb = GDB::GDB.new('arm.elf', gdb: 'gdb-multiarch')
|
27
32
|
def initialize(arguments, gdb: 'gdb')
|
33
|
+
gdb_bin = ::GDB::Util.which(gdb)
|
34
|
+
raise Errno::ENOENT, gdb if gdb_bin.nil?
|
35
|
+
|
28
36
|
arguments = "--command=#{File.join(SCRIPTS_PATH, 'gdbinit.py')}" + ' ' + arguments # XXX
|
29
|
-
@tube = spawn(
|
37
|
+
@tube = spawn(gdb_bin + ' ' + arguments)
|
30
38
|
pre = @tube.readuntil('GDBRuby:')
|
31
39
|
@prompt = @tube.readuntil("\n").strip
|
32
40
|
@tube.unget(pre + @tube.readuntil(@prompt))
|
@@ -37,8 +45,7 @@ module GDB
|
|
37
45
|
# @param [String] cmd
|
38
46
|
# Command to be executed.
|
39
47
|
#
|
40
|
-
#
|
41
|
-
# The execution result returned by gdb.
|
48
|
+
# @!macro gdb_displayed
|
42
49
|
#
|
43
50
|
# @example
|
44
51
|
# gdb = GDB::GDB.new('bash')
|
@@ -48,22 +55,24 @@ module GDB
|
|
48
55
|
# gdb.execute('print $rsi')
|
49
56
|
# #=> "$1 = 0x7fffffffdef8"
|
50
57
|
def execute(cmd)
|
58
|
+
# clear tube if not in interactive mode
|
59
|
+
@tube.clear unless interacting?
|
60
|
+
|
51
61
|
@tube.puts(cmd)
|
52
62
|
@tube.readuntil(@prompt).strip
|
53
63
|
end
|
54
64
|
alias exec execute
|
55
65
|
|
56
|
-
# Set
|
66
|
+
# Set breakpoints.
|
57
67
|
#
|
58
|
-
# This method some magic, see
|
68
|
+
# This method does some magic, see examples.
|
59
69
|
#
|
60
70
|
# @param [Integer, String] point
|
61
71
|
# If +Integer+ is given, will be translated as set break point
|
62
72
|
# at address +point+, i.e. equivalent to +break *<integer>+.
|
63
73
|
# If +String+ is given, equivalent to invoke +execute("break <point>")+.
|
64
74
|
#
|
65
|
-
#
|
66
|
-
# Returns what gdb displayed after set a break point.
|
75
|
+
# @!macro gdb_displayed
|
67
76
|
#
|
68
77
|
# @example
|
69
78
|
# gdb = GDB::GDB.new('bash')
|
@@ -79,13 +88,12 @@ module GDB
|
|
79
88
|
end
|
80
89
|
alias b break
|
81
90
|
|
82
|
-
# Run process.
|
91
|
+
# Run the process.
|
83
92
|
#
|
84
93
|
# @param [String] args
|
85
|
-
# Arguments to pass to run command.
|
94
|
+
# Arguments to pass to +run+ command.
|
86
95
|
#
|
87
|
-
#
|
88
|
-
# Returns what gdb displayed.
|
96
|
+
# @!macro gdb_displayed
|
89
97
|
#
|
90
98
|
# @example
|
91
99
|
# gdb = GDB::GDB.new('bash')
|
@@ -97,7 +105,7 @@ module GDB
|
|
97
105
|
#
|
98
106
|
# @note
|
99
107
|
# If breakpoints are not set properly and cause gdb hangs,
|
100
|
-
# this method
|
108
|
+
# this method hangs as well.
|
101
109
|
def run(args = '')
|
102
110
|
execute('run ' + args)
|
103
111
|
end
|
@@ -133,7 +141,7 @@ module GDB
|
|
133
141
|
end
|
134
142
|
alias code_base text_base
|
135
143
|
|
136
|
-
# Is process running?
|
144
|
+
# Is the process running?
|
137
145
|
#
|
138
146
|
# Actually judged by if {#pid} returns zero.
|
139
147
|
#
|
@@ -149,11 +157,43 @@ module GDB
|
|
149
157
|
# This method implemented by invoking +python print(gdb.selected_inferior().pid)+.
|
150
158
|
#
|
151
159
|
# @return [Integer]
|
152
|
-
# The pid of process. If process is not running, zero is returned.
|
160
|
+
# The pid of the process. If the process is not running, zero is returned.
|
153
161
|
def pid
|
154
162
|
@pid = python_p('gdb.selected_inferior().pid').to_i
|
155
163
|
end
|
156
164
|
|
165
|
+
# Execute +continue+ command.
|
166
|
+
#
|
167
|
+
# @!macro gdb_displayed
|
168
|
+
#
|
169
|
+
# @note
|
170
|
+
# This method may block the IO if no breakpoints are properly set.
|
171
|
+
def continue
|
172
|
+
check_alive!
|
173
|
+
execute('continue')
|
174
|
+
end
|
175
|
+
|
176
|
+
# Execute +info+ command.
|
177
|
+
#
|
178
|
+
# @param [String] args
|
179
|
+
# Arguments to pass to +info+ command.
|
180
|
+
#
|
181
|
+
# @!macro gdb_displayed
|
182
|
+
#
|
183
|
+
# @example
|
184
|
+
# gdb = GDB::GDB.new('spec/binaries/amd64.elf')
|
185
|
+
# gdb.break('main')
|
186
|
+
# gdb.run
|
187
|
+
# puts gdb.info('proc stat')
|
188
|
+
# # process 32537
|
189
|
+
# # cmdline = '/home/gdb-ruby/spec/binaries/amd64.elf'
|
190
|
+
# # cwd = '/home/gdb-ruby'
|
191
|
+
# # exe = '/home/gdb-ruby/spec/binaries/amd64.elf'
|
192
|
+
# gdb.close
|
193
|
+
def info(args = '')
|
194
|
+
execute('info ' + args)
|
195
|
+
end
|
196
|
+
|
157
197
|
# Read current process's memory.
|
158
198
|
#
|
159
199
|
# @param [Integer, String] addr
|
@@ -243,6 +283,7 @@ module GDB
|
|
243
283
|
#
|
244
284
|
# @param [String] cmd
|
245
285
|
# python command.
|
286
|
+
#
|
246
287
|
# @return [String]
|
247
288
|
# Execution result.
|
248
289
|
def python_p(cmd)
|
@@ -250,10 +291,13 @@ module GDB
|
|
250
291
|
end
|
251
292
|
|
252
293
|
# Enter gdb interactive mode.
|
253
|
-
#
|
294
|
+
# GDB will be closed after interaction.
|
254
295
|
#
|
255
296
|
# @return [void]
|
256
297
|
def interact
|
298
|
+
return if interacting?
|
299
|
+
|
300
|
+
@interacting = true
|
257
301
|
$stdin.raw { @tube.interact(method(:output_hook)) }
|
258
302
|
close
|
259
303
|
end
|
@@ -263,6 +307,7 @@ module GDB
|
|
263
307
|
# @return [void]
|
264
308
|
def close
|
265
309
|
return if @tube.closed?
|
310
|
+
|
266
311
|
@tube.close
|
267
312
|
Process.wait(@gdb_pid)
|
268
313
|
nil
|
@@ -271,6 +316,10 @@ module GDB
|
|
271
316
|
|
272
317
|
private
|
273
318
|
|
319
|
+
def interacting?
|
320
|
+
defined?(@interacting)
|
321
|
+
end
|
322
|
+
|
274
323
|
# Raise {GDBError} if process is not running.
|
275
324
|
#
|
276
325
|
# @return [void]
|
@@ -278,11 +327,9 @@ module GDB
|
|
278
327
|
raise GDBError, 'Process is not running' unless alive?
|
279
328
|
end
|
280
329
|
|
281
|
-
TIOCSWINSZ = 0x5414
|
282
|
-
|
283
330
|
def spawn(cmd)
|
284
331
|
output, input, @gdb_pid = PTY.spawn(cmd)
|
285
|
-
output.
|
332
|
+
IO.console && output.winsize = IO.console.winsize
|
286
333
|
::GDB::Tube::Tube.new(input, output)
|
287
334
|
end
|
288
335
|
|
@@ -290,15 +337,25 @@ module GDB
|
|
290
337
|
|
291
338
|
# @param [String] output
|
292
339
|
#
|
293
|
-
# @
|
340
|
+
# @yieldparam [String] output
|
341
|
+
# @yieldreturn [void]
|
342
|
+
#
|
343
|
+
# @return [void]
|
294
344
|
def output_hook(output)
|
295
345
|
idx = output.index(COMMAND_PREFIX)
|
296
346
|
return yield output.gsub(@prompt, '') if idx.nil?
|
347
|
+
|
297
348
|
yield output.slice!(0, idx)
|
298
349
|
cmd, args = output.slice(COMMAND_PREFIX.size..-1).split(' ', 2)
|
299
350
|
# only support ruby and pry now.
|
300
|
-
return yield output unless %w[ruby pry].include?(cmd)
|
301
|
-
|
351
|
+
return yield output unless %w[ruby pry rsource].include?(cmd)
|
352
|
+
|
353
|
+
args = case cmd
|
354
|
+
when 'pry' then '__send__(:invoke_pry)'
|
355
|
+
when 'rsource' then File.read(File.expand_path(args.strip))
|
356
|
+
else args
|
357
|
+
end
|
358
|
+
args = '__send__(:invoke_pry)' if cmd == 'pry'
|
302
359
|
# gdb by default set tty
|
303
360
|
# hack it
|
304
361
|
`stty opost onlcr`
|
@@ -313,7 +370,7 @@ module GDB
|
|
313
370
|
end
|
314
371
|
|
315
372
|
def eval_context
|
316
|
-
@
|
373
|
+
@eval_context ||= ::GDB::EvalContext.new(self)
|
317
374
|
end
|
318
375
|
end
|
319
376
|
end
|
data/lib/gdb/scripts/gdbinit.py
CHANGED
@@ -36,7 +36,7 @@ class GDBRuby():
|
|
36
36
|
return self.gdbruby_prompt + org
|
37
37
|
|
38
38
|
def _gen_prompt(self):
|
39
|
-
rnd = ''.join([random.choice(string.ascii_lowercase) for i in range(
|
39
|
+
rnd = ''.join([random.choice(string.ascii_lowercase) for i in range(20)])
|
40
40
|
return '(gdb-ruby-%s)' % rnd
|
41
41
|
|
42
42
|
__commands__ = []
|
@@ -99,6 +99,17 @@ Example:
|
|
99
99
|
"""
|
100
100
|
_cmdline_ = 'pry'
|
101
101
|
|
102
|
+
@register_command
|
103
|
+
class RSourceCommand():
|
104
|
+
_doc_ = """Source a Ruby script.
|
105
|
+
|
106
|
+
Syntax: rsource <file>
|
107
|
+
|
108
|
+
Example:
|
109
|
+
rsource ~/.gdbinit.rb
|
110
|
+
"""
|
111
|
+
_cmdline_ = 'rsource'
|
112
|
+
|
102
113
|
|
103
114
|
if not 'gdbruby' in globals():
|
104
115
|
[GDBRubyCommand(c) for c in __commands__]
|
data/lib/gdb/tube/buffer.rb
CHANGED
@@ -19,6 +19,7 @@ module GDB
|
|
19
19
|
def <<(str)
|
20
20
|
str = str.to_s.dup
|
21
21
|
return self if str.empty?
|
22
|
+
|
22
23
|
@data << str
|
23
24
|
@size += str.size
|
24
25
|
self
|
@@ -66,6 +67,7 @@ module GDB
|
|
66
67
|
# @return [void]
|
67
68
|
def unshift(str)
|
68
69
|
return if str.nil? || str.empty?
|
70
|
+
|
69
71
|
@data.unshift(str)
|
70
72
|
@size += str.size
|
71
73
|
end
|
data/lib/gdb/tube/tube.rb
CHANGED
@@ -32,6 +32,15 @@ module GDB
|
|
32
32
|
@buffer.get(n)
|
33
33
|
end
|
34
34
|
|
35
|
+
# Clear received data.
|
36
|
+
#
|
37
|
+
# @return [String]
|
38
|
+
# The data cleared.
|
39
|
+
# An empty string is returned if the buffer is already empty.
|
40
|
+
def clear
|
41
|
+
@buffer.get
|
42
|
+
end
|
43
|
+
|
35
44
|
# Receive from +io+ until string +str+ appears.
|
36
45
|
#
|
37
46
|
# @param [String] str
|
@@ -63,8 +72,10 @@ module GDB
|
|
63
72
|
#
|
64
73
|
# @return [void]
|
65
74
|
def puts(data)
|
75
|
+
return data.split("\n").each(&method(:puts)) if data.strip.include?("\n")
|
76
|
+
|
66
77
|
@in.puts(data)
|
67
|
-
readuntil(
|
78
|
+
readuntil("\n")
|
68
79
|
end
|
69
80
|
|
70
81
|
# Enter interactive mode.
|
@@ -83,11 +94,12 @@ module GDB
|
|
83
94
|
io, = IO.select([$stdin, @out])
|
84
95
|
@in.write($stdin.readpartial(READ_SIZE)) if io.include?($stdin)
|
85
96
|
next unless io.include?(@out)
|
97
|
+
|
86
98
|
begin
|
87
99
|
recv = @out.readpartial(READ_SIZE)
|
88
100
|
output_hook.call(recv) { |str| $stdout.write(str) }
|
89
101
|
@out.ungetc(@buffer.get) unless @buffer.empty?
|
90
|
-
rescue Errno::EIO
|
102
|
+
rescue Errno::EIO, EOFError
|
91
103
|
break
|
92
104
|
end
|
93
105
|
end
|
data/lib/gdb/util.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module GDB
|
2
|
+
# Defines utility methods.
|
3
|
+
module Util
|
4
|
+
module_function
|
5
|
+
|
6
|
+
# Cross-platform way of finding an executable in the $PATH.
|
7
|
+
#
|
8
|
+
# @param [String] cmd
|
9
|
+
# @return [String?]
|
10
|
+
# @example
|
11
|
+
# which('ruby')
|
12
|
+
# #=> "/usr/bin/ruby"
|
13
|
+
def which(cmd)
|
14
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
15
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
16
|
+
exts.each do |ext|
|
17
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
18
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
24
|
+
# The name of gdb could be:
|
25
|
+
# - gdb
|
26
|
+
# - ggdb (macOS)
|
27
|
+
# @return [String?]
|
28
|
+
# @example
|
29
|
+
# find_gdb
|
30
|
+
# #=> 'gdb'
|
31
|
+
def find_gdb
|
32
|
+
%w[gdb ggdb].find { |n| which(n) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/gdb/version.rb
CHANGED
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.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- david942j
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -30,84 +30,84 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.1.
|
33
|
+
version: 0.1.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.1.
|
40
|
+
version: 0.1.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '12.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '12.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '3.8'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '3.8'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rubocop
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '0.60'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '0.60'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
89
|
+
version: '0.15'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0.
|
96
|
+
version: '0.15'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: tty-platform
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
103
|
+
version: '0.1'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
110
|
+
version: '0.1'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: yard
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0.9'
|
125
|
-
description: 'It''s time for Ruby lovers to use Ruby in gdb, and
|
125
|
+
description: 'It''s time for Ruby lovers to use Ruby in gdb, and gdb in Ruby!
|
126
126
|
|
127
127
|
'
|
128
128
|
email:
|
@@ -141,6 +141,7 @@ files:
|
|
141
141
|
- lib/gdb/scripts/gdbinit.py
|
142
142
|
- lib/gdb/tube/buffer.rb
|
143
143
|
- lib/gdb/tube/tube.rb
|
144
|
+
- lib/gdb/util.rb
|
144
145
|
- lib/gdb/version.rb
|
145
146
|
homepage: https://github.com/david942j/gdb-ruby
|
146
147
|
licenses:
|
@@ -161,8 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
162
|
- !ruby/object:Gem::Version
|
162
163
|
version: '0'
|
163
164
|
requirements: []
|
164
|
-
|
165
|
-
rubygems_version: 2.6.14
|
165
|
+
rubygems_version: 3.0.2
|
166
166
|
signing_key:
|
167
167
|
specification_version: 4
|
168
168
|
summary: GDB Ruby-binding and Ruby command in GDB
|