debug 1.0.0.beta2 → 1.0.0.beta7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Ruby](https://github.com/ruby/debug/actions/workflows/ruby.yml/badge.svg?branch=master)](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)
|