debug 1.0.0.beta2 → 1.0.0.beta7
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 +4 -4
- data/.github/workflows/ruby.yml +34 -0
- data/.gitignore +3 -0
- data/CONTRIBUTING.md +336 -0
- data/Gemfile +2 -2
- data/README.md +190 -73
- data/TODO.md +27 -0
- data/bin/gentest +22 -0
- data/debug.gemspec +2 -0
- data/exe/rdbg +14 -11
- data/ext/debug/debug.c +10 -9
- data/lib/debug.rb +4 -1
- data/lib/debug/breakpoint.rb +110 -45
- data/lib/debug/client.rb +55 -13
- data/lib/debug/color.rb +76 -0
- data/lib/debug/config.rb +157 -33
- data/lib/debug/console.rb +26 -2
- data/lib/debug/frame_info.rb +145 -0
- data/lib/debug/open.rb +3 -0
- data/lib/debug/run.rb +4 -1
- data/lib/debug/server.rb +103 -50
- data/lib/debug/server_dap.rb +607 -0
- data/lib/debug/session.rb +534 -169
- data/lib/debug/source_repository.rb +64 -12
- data/lib/debug/thread_client.rb +211 -126
- data/lib/debug/version.rb +3 -1
- data/misc/README.md.erb +95 -47
- metadata +24 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d545d212530685e0eaf7163bc0b2517befd0edfdc1b083c64ecab6bfcb6958b8
|
4
|
+
data.tar.gz: 6662febf1dccfbc0e7e4ec785578fb5eac2a076fa488a4a3a814582f80fa940f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3173551c5ada6fb2f7f71656a5762b6a6a6cc541d80d371532abfe1e03188f81ffb397df1a2c8d743c34983e27c5abe6e33ae8d8188502960501801af3aa9ea3
|
7
|
+
data.tar.gz: 59c84ef76b01d8630b764784d68edb7b1e25e2c336cab56a74e23add5f606f14c3dfe2d6cdd9fe3779e328ca8873317d5d7b56a8e5a7951ecc3a081c20c309d8
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
strategy:
|
21
|
+
matrix:
|
22
|
+
ruby-version: ['2.6', '2.7', '3.0', 'head', 'debug']
|
23
|
+
|
24
|
+
steps:
|
25
|
+
- uses: actions/checkout@v2
|
26
|
+
- name: Set up Ruby
|
27
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
29
|
+
uses: ruby/setup-ruby@v1
|
30
|
+
with:
|
31
|
+
ruby-version: ${{ matrix.ruby-version }}
|
32
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
33
|
+
- name: Run tests
|
34
|
+
run: bundle exec rake
|
data/.gitignore
CHANGED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,336 @@
|
|
1
|
+
## Set Up a Development Environment
|
2
|
+
|
3
|
+
1. `$ git clone git@github.com:ruby/debug.git`
|
4
|
+
2. `$ bundle install`
|
5
|
+
3. `$ rake` - this will
|
6
|
+
- Compile the C extension locally (which can also be done solely with `rake compile`).
|
7
|
+
- Run tests.
|
8
|
+
- Re-generate `README.md`.
|
9
|
+
|
10
|
+
If you spot any problem, please open an issue.
|
11
|
+
|
12
|
+
## Run Tests
|
13
|
+
|
14
|
+
### Run all tests
|
15
|
+
|
16
|
+
```bash
|
17
|
+
$ rake test
|
18
|
+
```
|
19
|
+
|
20
|
+
### Run specific test(s)
|
21
|
+
|
22
|
+
|
23
|
+
```bash
|
24
|
+
$ ruby test/debug/bp_test.rb # run all tests in the specified file
|
25
|
+
$ ruby test/debug/bp_test.rb -h # to see all the test options
|
26
|
+
```
|
27
|
+
|
28
|
+
## Generate Tests
|
29
|
+
There is a test generator in `debug.rb` project to make it easier to write tests.
|
30
|
+
### Quickstart
|
31
|
+
This section shows you how to create test file by test generator. For more advanced informations on creating tests, please take a look at [gentest options](#gentest-options). (You can also check by `$bin/gentest -h`)
|
32
|
+
#### 1. Create a target file for debuggee.
|
33
|
+
Let's say, we created `target.rb` which is located in top level directory of debugger.
|
34
|
+
```ruby
|
35
|
+
module Foo
|
36
|
+
class Bar
|
37
|
+
def self.a
|
38
|
+
"hello"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
Bar.a
|
42
|
+
bar = Bar.new
|
43
|
+
end
|
44
|
+
```
|
45
|
+
#### 2. Run `gentest` as shown in the example below.
|
46
|
+
```shell
|
47
|
+
$ bin/gentest target.rb
|
48
|
+
```
|
49
|
+
#### 3. Debugger will be executed. You can type any debug commands.
|
50
|
+
```shell
|
51
|
+
$ bin/gentest target.rb
|
52
|
+
[1, 9] in ~/workspace/debug/target.rb
|
53
|
+
=> 1| module Foo
|
54
|
+
2| class Bar
|
55
|
+
3| def self.a
|
56
|
+
4| "hello"
|
57
|
+
5| end
|
58
|
+
6| end
|
59
|
+
7| Bar.a
|
60
|
+
8| bar = Bar.new
|
61
|
+
9| end
|
62
|
+
=>#0 <main> at ~/workspace/debug/target.rb:1
|
63
|
+
INTERNAL_INFO: {"location":"~/workspace/debug/target.rb:1","line":1}
|
64
|
+
|
65
|
+
(rdbg)s
|
66
|
+
s
|
67
|
+
[1, 9] in ~/workspace/debug/target.rb
|
68
|
+
1| module Foo
|
69
|
+
=> 2| class Bar
|
70
|
+
3| def self.a
|
71
|
+
4| "hello"
|
72
|
+
5| end
|
73
|
+
6| end
|
74
|
+
7| Bar.a
|
75
|
+
8| bar = Bar.new
|
76
|
+
9| end
|
77
|
+
=>#0 <module:Foo> at ~/workspace/debug/target.rb:2
|
78
|
+
#1 <main> at ~/workspace/debug/target.rb:1
|
79
|
+
INTERNAL_INFO: {"location":"~/workspace/debug/target.rb:2","line":2}
|
80
|
+
|
81
|
+
(rdbg)n
|
82
|
+
n
|
83
|
+
[1, 9] in ~/workspace/debug/target.rb
|
84
|
+
1| module Foo
|
85
|
+
2| class Bar
|
86
|
+
=> 3| def self.a
|
87
|
+
4| "hello"
|
88
|
+
5| end
|
89
|
+
6| end
|
90
|
+
7| Bar.a
|
91
|
+
8| bar = Bar.new
|
92
|
+
9| end
|
93
|
+
=>#0 <class:Bar> at ~/workspace/debug/target.rb:3
|
94
|
+
#1 <module:Foo> at ~/workspace/debug/target.rb:2
|
95
|
+
#2 <main> at ~/workspace/debug/target.rb:1
|
96
|
+
INTERNAL_INFO: {"location":"~/workspace/debug/target.rb:3","line":3}
|
97
|
+
|
98
|
+
(rdbg)b 7
|
99
|
+
b 7
|
100
|
+
INTERNAL_INFO: {"location":"~/workspace/debug/target.rb:3","line":3}
|
101
|
+
|
102
|
+
(rdbg)c
|
103
|
+
c
|
104
|
+
[2, 9] in ~/workspace/debug/target.rb
|
105
|
+
2| class Bar
|
106
|
+
3| def self.a
|
107
|
+
4| "hello"
|
108
|
+
5| end
|
109
|
+
6| end
|
110
|
+
=> 7| Bar.a
|
111
|
+
8| bar = Bar.new
|
112
|
+
9| end
|
113
|
+
=>#0 <module:Foo> at ~/workspace/debug/target.rb:7
|
114
|
+
#1 <main> at ~/workspace/debug/target.rb:1
|
115
|
+
|
116
|
+
Stop by #0 BP - Line /Users/naotto/workspace/debug/target.rb:7 (line)
|
117
|
+
INTERNAL_INFO: {"location":"~/workspace/debug/target.rb:7","line":7}
|
118
|
+
|
119
|
+
(rdbg)q!
|
120
|
+
q!
|
121
|
+
```
|
122
|
+
#### 4. The test file will be created as `test/debug/foo_test.rb`.
|
123
|
+
If the file already exists, **only method** will be added to it.
|
124
|
+
```ruby
|
125
|
+
# frozen_string_literal: true
|
126
|
+
|
127
|
+
require_relative '../support/test_case'
|
128
|
+
|
129
|
+
module DEBUGGER__
|
130
|
+
class FooTest < TestCase
|
131
|
+
def program
|
132
|
+
<<~RUBY
|
133
|
+
1| module Foo
|
134
|
+
1| class Bar
|
135
|
+
2| def self.a
|
136
|
+
3| "hello"
|
137
|
+
4| end
|
138
|
+
5| end
|
139
|
+
6| Bar.a
|
140
|
+
7| bar = Bar.new
|
141
|
+
8| end
|
142
|
+
RUBY
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_foo
|
146
|
+
debug_code(program) do
|
147
|
+
type 's'
|
148
|
+
assert_line_num 2
|
149
|
+
assert_line_text([
|
150
|
+
/[1, 9] in .*/,
|
151
|
+
/ 1| module Foo/,
|
152
|
+
/=> 2| class Bar/,
|
153
|
+
/ 3| def self.a/,
|
154
|
+
/ 4| "hello"/,
|
155
|
+
/ 5| end/,
|
156
|
+
/ 6| end/,
|
157
|
+
/ 7| Bar.a/,
|
158
|
+
/ 8| bar = Bar.new/,
|
159
|
+
/ 9| end/,
|
160
|
+
/=>#0 <module:Foo> at .*/,
|
161
|
+
/ #1 <main> at .*/
|
162
|
+
])
|
163
|
+
type 'n'
|
164
|
+
assert_line_num 3
|
165
|
+
assert_line_text([
|
166
|
+
/[1, 9] in .*/,
|
167
|
+
/ 1| module Foo/,
|
168
|
+
/ 2| class Bar/,
|
169
|
+
/=> 3| def self.a/,
|
170
|
+
/ 4| "hello"/,
|
171
|
+
/ 5| end/,
|
172
|
+
/ 6| end/,
|
173
|
+
/ 7| Bar.a/,
|
174
|
+
/ 8| bar = Bar.new/,
|
175
|
+
/ 9| end/,
|
176
|
+
/=>#0 <class:Bar> at .*/,
|
177
|
+
/ #1 <module:Foo> at .*/,
|
178
|
+
/ #2 <main> at .*/
|
179
|
+
])
|
180
|
+
type 'b 7'
|
181
|
+
assert_line_text(//)
|
182
|
+
type 'c'
|
183
|
+
assert_line_num 7
|
184
|
+
assert_line_text([
|
185
|
+
/[2, 9] in .*/,
|
186
|
+
/ 2| class Bar/,
|
187
|
+
/ 3| def self.a/,
|
188
|
+
/ 4| "hello"/,
|
189
|
+
/ 5| end/,
|
190
|
+
/ 6| end/,
|
191
|
+
/=> 7| Bar.a/,
|
192
|
+
/ 8| bar = Bar.new/,
|
193
|
+
/ 9| end/,
|
194
|
+
/=>#0 <module:Foo> at .*/,
|
195
|
+
/ #1 <main> at .*/,
|
196
|
+
//,
|
197
|
+
/Stop by #0 BP - Line .*/
|
198
|
+
])
|
199
|
+
type 'q!'
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
```
|
205
|
+
|
206
|
+
#### gentest options
|
207
|
+
You can get more information about `gentest` here.
|
208
|
+
|
209
|
+
The default method name is `test_foo` and the class name is `FooTest`. The file name will be `[Lowercase letters with "Test" removed from the class name]_test.rb`.
|
210
|
+
```shell
|
211
|
+
# run without any options(test method name will be `test_foo`, class name will be `FooTest`, file name will be `foo_test.rb`)
|
212
|
+
$ bin/gentest target.rb
|
213
|
+
# specify the class name(test method name will be `test_foo`, class name will be `StepTest`, file name will be `step_test.rb`)
|
214
|
+
$ bin/gentest target.rb -c StepTest
|
215
|
+
# specify the method name(test method name will be `test_step`, class name will be `FooTest`, file name will be `foo_test.rb`)
|
216
|
+
$ bin/gentest target.rb -m test_step
|
217
|
+
# specify class name and method name(test method name will be `test_step`, class name will be `StepTest`, file name will be `step_test.rb`.)
|
218
|
+
$ bin/gentest target.rb -c StepTest -m test_step
|
219
|
+
```
|
220
|
+
|
221
|
+
## To Update README
|
222
|
+
|
223
|
+
This project generates `README.md` from the template `misc/README.md.erb`
|
224
|
+
|
225
|
+
So **do not** directly update `README.md`. Instead, you should update the template's source and run
|
226
|
+
|
227
|
+
```bash
|
228
|
+
$ rake
|
229
|
+
```
|
230
|
+
|
231
|
+
to reflect the changes on `README.md`.
|
232
|
+
|
233
|
+
|
234
|
+
### When to re-generate `README.md`
|
235
|
+
|
236
|
+
- After updating `misc/README.md.erb`.
|
237
|
+
- After updating `rdbg` executable's options.
|
238
|
+
- After updating comments of debugger's commands.
|
239
|
+
|
240
|
+
## Manually Test Your Changes
|
241
|
+
|
242
|
+
You can manually test your changes with a simple Ruby script + a line of command. The following example will help you check:
|
243
|
+
|
244
|
+
- Breakpoint insertion.
|
245
|
+
- Resume from the breakpoint.
|
246
|
+
- Backtrace display.
|
247
|
+
- Information (local variables, ivars..etc.) display.
|
248
|
+
- Debugger exit.
|
249
|
+
|
250
|
+
|
251
|
+
### Script
|
252
|
+
|
253
|
+
```ruby
|
254
|
+
# target.rb
|
255
|
+
class Foo
|
256
|
+
def first_call
|
257
|
+
second_call(20)
|
258
|
+
end
|
259
|
+
|
260
|
+
def second_call(num)
|
261
|
+
third_call_with_block do |ten|
|
262
|
+
forth_call(num, ten)
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def third_call_with_block(&block)
|
267
|
+
@ivar1 = 10; @ivar2 = 20
|
268
|
+
|
269
|
+
yield(10)
|
270
|
+
end
|
271
|
+
|
272
|
+
def forth_call(num1, num2)
|
273
|
+
num1 + num2
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
Foo.new.first_call
|
278
|
+
```
|
279
|
+
|
280
|
+
### Command
|
281
|
+
|
282
|
+
```
|
283
|
+
$ exe/rdbg -e 'b 20;; c ;; bt ;; info ;; q!' -e c target.rb
|
284
|
+
```
|
285
|
+
|
286
|
+
### Expect Result
|
287
|
+
|
288
|
+
```
|
289
|
+
❯ exe/rdbg -e 'b 20;; c ;; bt ;; info ;; q!' -e c target.rb
|
290
|
+
[1, 10] in target.rb
|
291
|
+
=> 1| class Foo
|
292
|
+
2| def first_call
|
293
|
+
3| second_call(20)
|
294
|
+
4| end
|
295
|
+
5|
|
296
|
+
6| def second_call(num)
|
297
|
+
7| third_call_with_block do |ten|
|
298
|
+
8| forth_call(num, ten)
|
299
|
+
9| end
|
300
|
+
10| end
|
301
|
+
=>#0 <main> at target.rb:1
|
302
|
+
(rdbg:init) b 20
|
303
|
+
#1 line bp /PATH_TO_PROJECT/debug/target.rb:20 (return)
|
304
|
+
(rdbg:init) c
|
305
|
+
[15, 23] in target.rb
|
306
|
+
15| yield(10)
|
307
|
+
16| end
|
308
|
+
17|
|
309
|
+
18| def forth_call(num1, num2)
|
310
|
+
19| num1 + num2
|
311
|
+
=> 20| end
|
312
|
+
21| end
|
313
|
+
22|
|
314
|
+
23| Foo.new.first_call
|
315
|
+
=>#0 Foo#forth_call(num1=20, num2=10) at target.rb:20 #=> 30
|
316
|
+
#1 block{|ten=10|} in second_call at target.rb:8
|
317
|
+
# and 4 frames (use `bt' command for all frames)
|
318
|
+
|
319
|
+
Stop by #1 line bp /PATH_TO_PROJECT/debug/target.rb:20 (return)
|
320
|
+
(rdbg:init) bt
|
321
|
+
=>#0 Foo#forth_call(num1=20, num2=10) at target.rb:20 #=> 30
|
322
|
+
#1 block{|ten=10|} in second_call at target.rb:8
|
323
|
+
#2 Foo#third_call_with_block(block=#<Proc:0x00007f8bc32f0c28 target.rb:7>) at target.rb:15
|
324
|
+
#3 Foo#second_call(num=20) at target.rb:7
|
325
|
+
#4 first_call at target.rb:3
|
326
|
+
#5 <main> at target.rb:23
|
327
|
+
(rdbg:init) info
|
328
|
+
=>#0 Foo#forth_call(num1=20, num2=10) at target.rb:20 #=> 30
|
329
|
+
%self => #<Foo:0x00007f8bc32f0ed0>
|
330
|
+
%return => 30
|
331
|
+
num1 => 20
|
332
|
+
num2 => 10
|
333
|
+
@ivar1 => 10
|
334
|
+
@ivar2 => 20
|
335
|
+
(rdbg:init) q!
|
336
|
+
```
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://github.com/ruby/debug/actions/workflows/ruby.yml?query=branch%3Amaster)
|
2
|
+
|
1
3
|
# debug.rb
|
2
4
|
|
3
5
|
This library provides debugging functionality to Ruby.
|
@@ -9,7 +11,7 @@ New debug.rb has several advantages:
|
|
9
11
|
* Remote debugging: Support remote debugging natively.
|
10
12
|
* UNIX domain socket
|
11
13
|
* TCP/IP
|
12
|
-
* VSCode/DAP integration (
|
14
|
+
* VSCode/DAP integration ([VSCode rdbg Ruby Debugger - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=KoichiSasada.vscode-rdbg))
|
13
15
|
* Extensible: application can introduce debugging support with several methods
|
14
16
|
* By `rdbg` command
|
15
17
|
* By loading libraries with `-r` command line option
|
@@ -27,6 +29,16 @@ $ gem install debug --pre
|
|
27
29
|
|
28
30
|
or specify `-Ipath/to/debug/lib` in `RUBYOPT` or each ruby command-line option, especially for debug this gem development.
|
29
31
|
|
32
|
+
If you use Bundler, write the following line to your Gemfile. And use rdbg command with -c option.
|
33
|
+
|
34
|
+
```
|
35
|
+
gem "debug", ">= 1.0.0.beta"
|
36
|
+
```
|
37
|
+
|
38
|
+
```
|
39
|
+
$ rdbg -c bundle exec ruby target.rb
|
40
|
+
```
|
41
|
+
|
30
42
|
# How to use
|
31
43
|
|
32
44
|
## Invoke with debugger
|
@@ -49,33 +61,54 @@ To use debugging feature, you can have 3 ways.
|
|
49
61
|
|
50
62
|
### Local debug console
|
51
63
|
|
64
|
+
#### (1) Use `rdbg` command
|
65
|
+
|
52
66
|
```
|
53
|
-
# (1) Use `rdbg` command
|
54
67
|
$ rdbg target.rb
|
55
68
|
$ rdbg -- -r foo -e expr # -- is required to make clear rdbg options and ruby's options
|
69
|
+
```
|
56
70
|
|
57
|
-
|
71
|
+
#### (2) Use `-r debug/run` command line option
|
58
72
|
|
73
|
+
```
|
59
74
|
$ ruby -r debug/run target.rb
|
75
|
+
```
|
60
76
|
|
61
|
-
|
77
|
+
#### (3) Write `require 'debug...'` in .rb files
|
62
78
|
|
63
|
-
|
79
|
+
```ruby
|
80
|
+
# target.rb
|
64
81
|
require 'debug/run' # start the debug console
|
65
|
-
...
|
66
82
|
|
67
|
-
#
|
83
|
+
# ... rest of program ...
|
84
|
+
```
|
68
85
|
|
69
|
-
$ cat target.rb
|
70
|
-
require 'debug/session' # introduce the functionality
|
71
|
-
DEBUGGER__.console # and start the debug console
|
72
86
|
|
87
|
+
```
|
73
88
|
$ ruby target.rb
|
74
89
|
```
|
75
90
|
|
76
91
|
When you run the program with the debug console, you will see the debug console prompt `(rdbg)`.
|
77
92
|
The debuggee program (`target.rb`) is suspended at the beginning of `target.rb`.
|
78
93
|
|
94
|
+
|
95
|
+
Alternatively, start the debugger at a specific location in your program using `binding.break` (`binding.b` for short).
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
# target.rb
|
99
|
+
require 'debug' # start the debugger
|
100
|
+
|
101
|
+
# ... program ...
|
102
|
+
|
103
|
+
binding.break # setup a breakpoint at this line
|
104
|
+
|
105
|
+
# ... rest of program ...
|
106
|
+
```
|
107
|
+
|
108
|
+
```
|
109
|
+
$ ruby target.rb
|
110
|
+
```
|
111
|
+
|
79
112
|
You can type any debugger's command described bellow. "c" or "continue" resume the debuggee program.
|
80
113
|
You can suspend the debuggee program and show the debug console with `Ctrl-C`.
|
81
114
|
|
@@ -143,33 +176,36 @@ $ rdbg ~/src/rb/target.rb
|
|
143
176
|
|
144
177
|
### Remote debug (1) UNIX domain socket
|
145
178
|
|
179
|
+
#### (1) Use `rdbg` command
|
180
|
+
|
146
181
|
```
|
147
|
-
# (1) Use `rdbg` command
|
148
182
|
$ rdbg --open target.rb # or rdbg -O target.rb for shorthand
|
149
183
|
Debugger can attach via UNIX domain socket (/home/ko1/.ruby-debug-sock/ruby-debug-ko1-5042)
|
150
|
-
|
184
|
+
```
|
151
185
|
|
152
|
-
|
186
|
+
#### (2) Use `-r debug/open` command line option
|
153
187
|
|
188
|
+
```
|
154
189
|
$ ruby -r debug/open target.rb
|
155
190
|
Debugger can attach via UNIX domain socket (/home/ko1/.ruby-debug-sock/ruby-debug-ko1-5042)
|
156
|
-
|
191
|
+
```
|
157
192
|
|
158
|
-
|
159
|
-
|
193
|
+
#### (3) Write `require 'debug/open'` in .rb files
|
194
|
+
|
195
|
+
```ruby
|
196
|
+
# target.rb
|
160
197
|
require 'debug/open' # open the debugger entry point by UNIX domain socket.
|
161
|
-
...
|
162
198
|
|
163
199
|
# or
|
164
200
|
|
165
|
-
$ cat target.rb
|
166
201
|
require 'debug/server' # introduce remote debugging feature
|
167
202
|
DEBUGGER__.open # open the debugger entry point by UNIX domain socket.
|
168
203
|
# or DEBUGGER__.open_unix to specify UNIX domain socket.
|
204
|
+
```
|
169
205
|
|
206
|
+
```
|
170
207
|
$ ruby target.rb
|
171
208
|
Debugger can attach via UNIX domain socket (/home/ko1/.ruby-debug-sock/ruby-debug-ko1-5042)
|
172
|
-
...
|
173
209
|
```
|
174
210
|
|
175
211
|
It runs target.rb and accept debugger connection within UNIX domain socket.
|
@@ -233,40 +269,49 @@ The socket file is located at
|
|
233
269
|
|
234
270
|
You can open the TCP/IP port instead of using UNIX domain socket.
|
235
271
|
|
272
|
+
#### (1) Use `rdbg` command
|
273
|
+
|
236
274
|
```
|
237
|
-
# (1) Use `rdbg` command
|
238
275
|
$ rdbg -O --port=12345 target.rb
|
239
276
|
# or
|
240
277
|
$ rdbg --open --port=12345 target.rb
|
241
278
|
Debugger can attach via TCP/IP (localhost:12345)
|
242
|
-
|
279
|
+
```
|
243
280
|
|
244
|
-
|
281
|
+
#### (2) Use `-r debug/open` command line option
|
245
282
|
|
283
|
+
|
284
|
+
```
|
246
285
|
$ RUBY_DEBUG_PORT=12345 ruby -r debug/open target.rb
|
247
286
|
Debugger can attach via TCP/IP (localhost:12345)
|
248
|
-
|
287
|
+
```
|
288
|
+
|
289
|
+
#### (3) Write `require 'debug/open'` in .rb files
|
249
290
|
|
250
|
-
|
251
|
-
|
291
|
+
```ruby
|
292
|
+
# target.rb
|
252
293
|
require 'debug/open' # open the debugger entry point.
|
253
|
-
|
294
|
+
```
|
295
|
+
|
296
|
+
and run with environment variable RUBY_DEBUG_PORT
|
254
297
|
|
255
|
-
|
298
|
+
```
|
256
299
|
$ RUBY_DEBUG_PORT=12345 ruby target.rb
|
257
300
|
Debugger can attach via TCP/IP (localhost:12345)
|
258
|
-
|
301
|
+
```
|
259
302
|
|
260
|
-
|
303
|
+
or
|
261
304
|
|
262
|
-
|
305
|
+
```ruby
|
306
|
+
# target.rb
|
263
307
|
require 'debug/server' # introduce remote debugging feature
|
264
308
|
DEBUGGER__.open(port: 12345)
|
265
309
|
# or DEBUGGER__.open_tcp(port: 12345)
|
310
|
+
```
|
266
311
|
|
312
|
+
```
|
267
313
|
$ ruby target.rb
|
268
314
|
Debugger can attach via TCP/IP (localhost:12345)
|
269
|
-
...
|
270
315
|
```
|
271
316
|
|
272
317
|
You can also specify the host with the `RUBY_DEBUG_HOST` environment variable. And also `DEBUGGER__.open` method accepts a `host:` keyword parameter. If the host is not given, `localhost` will be used.
|
@@ -280,26 +325,45 @@ $ rdbg --attach hostname 12345
|
|
280
325
|
|
281
326
|
### Initial scripts
|
282
327
|
|
283
|
-
If there are
|
328
|
+
If there are `~/.rdbgrc`, the file is loaded as initial scripts which contains debugger commands at the beginning of debug session. `RUBY_DEBUG_INIT_SCRIPT` environment variable can specify the initial script file. You can write configurations in a file. For example, you can set break points with `break file:123` in `~/.rdbgrc`.
|
284
329
|
|
285
|
-
|
330
|
+
If there are `~/.rdbgrc.rb` is available, it is loaded as a ruby script at same timing.
|
286
331
|
|
287
|
-
|
332
|
+
### Configurations
|
288
333
|
|
289
|
-
|
334
|
+
You can configure debugger's setting with environment variables and `config` command.
|
335
|
+
You can write any configuration into `~/.rdbgrc` like:
|
290
336
|
|
291
|
-
|
337
|
+
```
|
338
|
+
config set log_level INFO
|
339
|
+
config set no_color true
|
340
|
+
```
|
292
341
|
|
293
|
-
* `RUBY_DEBUG_NONSTOP`: 1 for nonstop at the beginning of program.
|
294
|
-
* `RUBY_DEBUG_INIT_SCRIPT`: Initial script path loaded at the first stop.
|
295
|
-
* `RUBY_DEBUG_COMMANDS`: Debug commands invoked at the first stop. Commands should be separated by ';;'.
|
296
|
-
* `RUBY_DEBUG_SHOW_SRC_LINES`: Show n lines source code on breakpoint (default: 10 lines).
|
297
|
-
* `RUBY_DEBUG_SHOW_FRAMES`: Show n frames on breakpoint (default: 2 frames).
|
298
342
|
|
299
|
-
*
|
300
|
-
* `
|
301
|
-
* `
|
302
|
-
* `
|
343
|
+
* UI
|
344
|
+
* `RUBY_DEBUG_LOG_LEVEL` (`log_level`): Log level same as Logger (default: WARN)
|
345
|
+
* `RUBY_DEBUG_SHOW_SRC_LINES` (`show_src_lines`): Show n lines source code on breakpoint (default: 10 lines)
|
346
|
+
* `RUBY_DEBUG_SHOW_FRAMES` (`show_frames`): Show n frames on breakpoint (default: 2 frames)
|
347
|
+
* `RUBY_DEBUG_SHOW_INFO_LINES` (`show_info_lines`): Show n lines on info command (default: 10 lines, 0 for unlimited)
|
348
|
+
* `RUBY_DEBUG_USE_SHORT_PATH` (`use_short_path`): Show shoten PATH (like $(Gem)/foo.rb)
|
349
|
+
* `RUBY_DEBUG_SKIP_NOSRC` (`skip_nosrc`): Skip on no source code lines (default: false)
|
350
|
+
* `RUBY_DEBUG_SKIP_PATH` (`skip_path`): Skip showing frames for given paths (default: [])
|
351
|
+
* `RUBY_DEBUG_NO_COLOR` (`no_color`): Do not use colorize (default: false)
|
352
|
+
* `RUBY_DEBUG_NO_SIGINT_HOOK` (`no_sigint_hook`): Do not suspend on SIGINT (default: false)
|
353
|
+
|
354
|
+
* BOOT
|
355
|
+
* `RUBY_DEBUG_NONSTOP` (`nonstop`): Nonstop mode
|
356
|
+
* `RUBY_DEBUG_INIT_SCRIPT` (`init_script`): debug command script path loaded at first stop
|
357
|
+
* `RUBY_DEBUG_COMMANDS` (`commands`): debug commands invoked at first stop. commands should be separated by ';;'
|
358
|
+
* `RUBY_DEBUG_NO_RC` (`no_rc`): ignore loading ~/.rdbgrc(.rb)
|
359
|
+
* `RUBY_DEBUG_HISTORY` (`history`): save and load history file (default: ~/.rdbg_history)
|
360
|
+
|
361
|
+
* REMOTE
|
362
|
+
* `RUBY_DEBUG_PORT` (`port`): TCP/IP remote debugging: port
|
363
|
+
* `RUBY_DEBUG_HOST` (`host`): TCP/IP remote debugging: host (localhost if not given)
|
364
|
+
* `RUBY_DEBUG_SOCK_PATH` (`sock_path`): UNIX Domain Socket remote debugging: socket path
|
365
|
+
* `RUBY_DEBUG_SOCK_DIR` (`sock_dir`): UNIX Domain Socket remote debugging: socket directory
|
366
|
+
* `RUBY_DEBUG_COOKIE` (`cookie`): Cookie for negotiation
|
303
367
|
|
304
368
|
## Debug command on the debug console
|
305
369
|
|
@@ -321,10 +385,14 @@ The `<...>` notation means the argument.
|
|
321
385
|
* Finish this frame. Resume the program until the current frame is finished.
|
322
386
|
* `c[ontinue]`
|
323
387
|
* Resume the program.
|
324
|
-
* `q[uit]` or
|
388
|
+
* `q[uit]` or `Ctrl-D`
|
325
389
|
* Finish debugger (with the debuggee process on non-remote debugging).
|
326
|
-
* `
|
327
|
-
*
|
390
|
+
* `q[uit]!`
|
391
|
+
* Same as q[uit] but without the confirmation prompt.
|
392
|
+
* `kill`
|
393
|
+
* Stop the debuggee process with `Kernal#exit!`.
|
394
|
+
* `kill!`
|
395
|
+
* Same as kill but without the confirmation prompt.
|
328
396
|
|
329
397
|
### Breakpoint
|
330
398
|
|
@@ -338,15 +406,19 @@ The `<...>` notation means the argument.
|
|
338
406
|
* Set breakpoint on the method `<class>#<name>`.
|
339
407
|
* `b[reak] <expr>.<name>`
|
340
408
|
* Set breakpoint on the method `<expr>.<name>`.
|
341
|
-
* `b[reak] ... if <expr>`
|
409
|
+
* `b[reak] ... if: <expr>`
|
342
410
|
* break if `<expr>` is true at specified location.
|
343
|
-
* `b[reak]
|
344
|
-
* break
|
411
|
+
* `b[reak] ... pre: <command>`
|
412
|
+
* break and run `<command>` before stopping.
|
413
|
+
* `b[reak] ... do: <command>`
|
414
|
+
* break and run `<command>`, and continue.
|
415
|
+
* `b[reak] if: <expr>`
|
416
|
+
* break if: `<expr>` is true at any lines.
|
345
417
|
* Note that this feature is super slow.
|
346
418
|
* `catch <Error>`
|
347
419
|
* Set breakpoint on raising `<Error>`.
|
348
|
-
* `watch
|
349
|
-
* Stop the execution when the result of
|
420
|
+
* `watch @ivar`
|
421
|
+
* Stop the execution when the result of current scope's `@ivar` is changed.
|
350
422
|
* Note that this feature is super slow.
|
351
423
|
* `del[ete]`
|
352
424
|
* delete all breakpoints.
|
@@ -357,6 +429,12 @@ The `<...>` notation means the argument.
|
|
357
429
|
|
358
430
|
* `bt` or `backtrace`
|
359
431
|
* Show backtrace (frame) information.
|
432
|
+
* `bt <num>` or `backtrace <num>`
|
433
|
+
* Only shows first `<num>` frames.
|
434
|
+
* `bt /regexp/` or `backtrace /regexp/`
|
435
|
+
* Only shows frames with method name or location info that matches `/regexp/`.
|
436
|
+
* `bt <num> /regexp/` or `backtrace <num> /regexp/`
|
437
|
+
* Only shows first `<num>` frames with method name or location info that matches `/regexp/`.
|
360
438
|
* `l[ist]`
|
361
439
|
* Show current frame's source code.
|
362
440
|
* Next `list` command shows the successor lines.
|
@@ -369,11 +447,11 @@ The `<...>` notation means the argument.
|
|
369
447
|
* Note that edited file will not be reloaded.
|
370
448
|
* `edit <file>`
|
371
449
|
* Open <file> on the editor.
|
372
|
-
* `i[nfo]`
|
450
|
+
* `i[nfo]`, `i[nfo] l[ocal[s]]`
|
373
451
|
* Show information about the current frame (local variables)
|
374
452
|
* It includes `self` as `%self` and a return value as `%return`.
|
375
|
-
* `i[nfo]
|
376
|
-
* Show
|
453
|
+
* `i[nfo] th[read[s]]`
|
454
|
+
* Show all threads (same as `th[read]`).
|
377
455
|
* `display`
|
378
456
|
* Show display setting.
|
379
457
|
* `display <expr>`
|
@@ -388,13 +466,13 @@ The `<...>` notation means the argument.
|
|
388
466
|
### Frame control
|
389
467
|
|
390
468
|
* `f[rame]`
|
391
|
-
* Show current frame.
|
469
|
+
* Show the current frame.
|
392
470
|
* `f[rame] <framenum>`
|
393
|
-
* Specify frame. Evaluation are run on
|
471
|
+
* Specify a current frame. Evaluation are run on specified frame.
|
394
472
|
* `up`
|
395
|
-
* Specify upper frame.
|
473
|
+
* Specify the upper frame.
|
396
474
|
* `down`
|
397
|
-
* Specify
|
475
|
+
* Specify the lower frame.
|
398
476
|
|
399
477
|
### Evaluate
|
400
478
|
|
@@ -414,6 +492,19 @@ The `<...>` notation means the argument.
|
|
414
492
|
* `th[read] <thnum>`
|
415
493
|
* Switch thread specified by `<thnum>`.
|
416
494
|
|
495
|
+
### Configuration
|
496
|
+
|
497
|
+
* `config`
|
498
|
+
* Show all configuration with description.
|
499
|
+
* `config <name>`
|
500
|
+
* Show current configuration of <name>.
|
501
|
+
* `config set <name> <val>` or `config <name> = <val>`
|
502
|
+
* Set <name> to <val>.
|
503
|
+
* `config append <name> <val>` or `config <name> << <val>`
|
504
|
+
* Append `<val>` to `<name>` if it is an array.
|
505
|
+
* `config unset <name>`
|
506
|
+
* Set <name> to default.
|
507
|
+
|
417
508
|
### Help
|
418
509
|
|
419
510
|
* `h[elp]`
|
@@ -429,35 +520,61 @@ exe/rdbg [options] -- [debuggee options]
|
|
429
520
|
|
430
521
|
Debug console mode:
|
431
522
|
-n, --nonstop Do not stop at the beginning of the script.
|
432
|
-
-e
|
433
|
-
-
|
523
|
+
-e DEBUG_COMMAND Execute debug command at the beginning of the script.
|
524
|
+
-x, --init-script=FILE Execute debug command in the FILE.
|
525
|
+
--no-rc Ignore ~/.rdbgrc
|
526
|
+
--no-color Disable colorize
|
527
|
+
-c, --command Enable command mode.
|
528
|
+
The first argument should be a command name in $PATH.
|
529
|
+
Example: 'rdbg -c bundle exec rake test'
|
530
|
+
|
531
|
+
-O, --open Start remote debugging with opening the network port.
|
434
532
|
If TCP/IP options are not given,
|
435
533
|
a UNIX domain socket will be used.
|
436
|
-
--
|
437
|
-
--
|
534
|
+
--sock-path=SOCK_PATH UNIX Doman socket path
|
535
|
+
--port=PORT Listening TCP/IP port
|
536
|
+
--host=HOST Listening TCP/IP host
|
537
|
+
--cookie=COOKIE Set a cookie for connection
|
438
538
|
|
439
539
|
Debug console mode runs Ruby program with the debug console.
|
440
540
|
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
541
|
+
'rdbg target.rb foo bar' starts like 'ruby target.rb foo bar'.
|
542
|
+
'rdbg -- -r foo -e bar' starts like 'ruby -r foo -e bar'.
|
543
|
+
'rdbg -c rake test' starts like 'rake test'.
|
544
|
+
'rdbg -c -- rake test -t' starts like 'rake test -t'.
|
545
|
+
'rdbg -c bundle exec rake test' starts like 'bundle exec rake test'.
|
546
|
+
'rdbg -O target.rb foo bar' starts and accepts attaching with UNIX domain socket.
|
547
|
+
'rdbg -O --port 1234 target.rb foo bar' starts accepts attaching with TCP/IP localhost:1234.
|
548
|
+
'rdbg -O --port 1234 -- -r foo -e bar' starts accepts attaching with TCP/IP localhost:1234.
|
446
549
|
|
447
550
|
Attach mode:
|
448
551
|
-A, --attach Attach to debuggee process.
|
449
552
|
|
450
553
|
Attach mode attaches the remote debug console to the debuggee process.
|
451
554
|
|
452
|
-
'
|
555
|
+
'rdbg -A' tries to connect via UNIX domain socket.
|
453
556
|
If there are multiple processes are waiting for the
|
454
557
|
debugger connection, list possible debuggee names.
|
455
|
-
'
|
456
|
-
'
|
457
|
-
'
|
558
|
+
'rdbg -A path' tries to connect via UNIX domain socket with given path name.
|
559
|
+
'rdbg -A port' tries to connect to localhost:port via TCP/IP.
|
560
|
+
'rdbg -A host port' tries to connect to host:port via TCP/IP.
|
561
|
+
|
562
|
+
Other options:
|
563
|
+
-h, --help Print help
|
564
|
+
--util=NAME Utility mode (used by tools)
|
565
|
+
|
566
|
+
NOTE
|
567
|
+
All messages communicated between a debugger and a debuggee are *NOT* encrypted.
|
568
|
+
Please use the remote debugging feature carefully.
|
458
569
|
|
459
570
|
```
|
460
571
|
|
461
572
|
# Contributing
|
462
573
|
|
463
574
|
Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/debug.
|
575
|
+
|
576
|
+
Please also check the [contributing guideline](/CONTRIBUTING.md).
|
577
|
+
|
578
|
+
# Acknowledgement
|
579
|
+
|
580
|
+
* Some tests are based on [deivid-rodriguez/byebug: Debugging in Ruby 2](https://github.com/deivid-rodriguez/byebug)
|