byebug 1.4.2 → 1.5.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 +4 -4
- data/CHANGELOG.md +6 -0
- data/GUIDE.md +72 -187
- data/bin/byebug +0 -3
- data/byebug.gemspec +1 -1
- data/ext/byebug/byebug.c +22 -25
- data/ext/byebug/context.c +15 -7
- data/ext/byebug/extconf.rb +1 -1
- data/lib/byebug.rb +0 -41
- data/lib/byebug/commands/frame.rb +0 -46
- data/lib/byebug/context.rb +0 -1
- data/lib/byebug/processor.rb +1 -1
- data/lib/byebug/version.rb +1 -1
- data/old_doc/test-triangle.rb +2 -3
- data/test/examples/frame_deep.rb +20 -0
- data/test/frame_test.rb +38 -4
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4921997bbc597c75dbd51c1a5abde4fa366ce05
|
4
|
+
data.tar.gz: e56edf6e9529823d52edfe543ed9f450258bf893
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69d7c6ffe0e19f58695bc007a1b44b44e743cd669939a53b0c491d209d417f4f963ca18085d07c5b7ca5a9fe7820ca59455bd2ec269c9a6963d3bdfe0a75bffe
|
7
|
+
data.tar.gz: ce3049894fe8169c214ce6953dd468a3343caa1e45971f093d9a73e5f3c6b778d4fa51b0ecbdb3806094b776fb4adecb4965c77689e5470a2a7fed5503dc5fce
|
data/CHANGELOG.md
CHANGED
data/GUIDE.md
CHANGED
@@ -98,8 +98,8 @@ Okay, lets go on and talk about program arguments.
|
|
98
98
|
[]
|
99
99
|
```
|
100
100
|
|
101
|
-
Ooops. We forgot to specify any parameters to this program. Let's try again. We
|
102
|
-
use the `restart` command here.
|
101
|
+
Ooops. We forgot to specify any parameters to this program. Let's try again. We
|
102
|
+
can use the `restart` command here.
|
103
103
|
|
104
104
|
```
|
105
105
|
(byebug) restart 3
|
@@ -175,10 +175,8 @@ Stopped by breakpoint 1 at /home/davidr/Proyectos/byebug/old_doc/hanoi.rb:3
|
|
175
175
|
(byebug) set nofullpath
|
176
176
|
Displaying frame's full file names is off.
|
177
177
|
(byebug) where
|
178
|
-
--> #0 Object.hanoi(n#Fixnum, a#Symbol, b#Symbol, c#Symbol)
|
179
|
-
|
180
|
-
#1 Object.hanoi(n#Fixnum, a#Symbol, b#Symbol, c#Symbol)
|
181
|
-
at .../byebug/old_doc/hanoi.rb:8
|
178
|
+
--> #0 Object.hanoi(n#Fixnum, a#Symbol, b#Symbol, c#Symbol) at .../byebug/old_doc/hanoi.rb:4
|
179
|
+
#1 Object.hanoi(n#Fixnum, a#Symbol, b#Symbol, c#Symbol) at .../byebug/old_doc/hanoi.rb:8
|
182
180
|
#2 <top (required)> at .../byebug/old_doc/hanoi.rb:34
|
183
181
|
(byebug)
|
184
182
|
```
|
@@ -231,19 +229,12 @@ frame #3, the value of `i_args` can be shown. Also note that the value of
|
|
231
229
|
variable `n` is different.
|
232
230
|
|
233
231
|
|
234
|
-
###
|
232
|
+
### Attaching to a running program with `byebug`
|
235
233
|
|
236
|
-
In the previous sessions we've been calling byebug right at the outset, but
|
237
|
-
is
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
* Byebug just doesn't work when run at the outset. Any debugging changes the
|
242
|
-
behavior or the program in slight and subtle ways, and sometimes this can hinder
|
243
|
-
finding bugs.
|
244
|
-
* There's a lot of code that needs to be run before the part you want to
|
245
|
-
inspect. Running this code takes time and you don't want the overhead of
|
246
|
-
byebug.
|
234
|
+
In the previous sessions we've been calling byebug right at the outset, but
|
235
|
+
there is another mode of operation you might use. If there's a lot of code that
|
236
|
+
needs to be run before the part you want to inspect, it might not be efficient
|
237
|
+
or convenient to run byebug from the outset.
|
247
238
|
|
248
239
|
In this section we'll show how to enter the code in the middle of your program,
|
249
240
|
while delving more into byebug's operation. We will also use unit testing. Using
|
@@ -269,15 +260,15 @@ if __FILE__ == $0
|
|
269
260
|
end
|
270
261
|
```
|
271
262
|
|
272
|
-
Okay, we're now ready to write our unit test. We'll use `
|
263
|
+
Okay, we're now ready to write our unit test. We'll use `minitest` which comes
|
273
264
|
with the standard Ruby distribution. Here's the test code; it should be in the
|
274
265
|
same directory as `triangle.rb`.
|
275
266
|
|
276
267
|
```ruby
|
277
|
-
require '
|
268
|
+
require 'minitest/autorun'
|
278
269
|
require_relative 'triangle.rb'
|
279
270
|
|
280
|
-
class TestTri <
|
271
|
+
class TestTri < MiniTest::Unit::TestCase
|
281
272
|
def test_basic
|
282
273
|
solutions = []
|
283
274
|
0.upto(5) do |i|
|
@@ -295,145 +286,62 @@ add the following:
|
|
295
286
|
```ruby
|
296
287
|
...
|
297
288
|
def test_basic
|
298
|
-
require 'byebug'
|
299
289
|
byebug
|
300
290
|
solutions = []
|
301
291
|
...
|
302
292
|
```
|
303
293
|
|
304
|
-
Now we run the program
|
294
|
+
Now we run the program, requiring `byebug`
|
305
295
|
```
|
306
|
-
$ ruby test-triangle.rb
|
307
|
-
Run options:
|
296
|
+
$ ruby -rbyebug test-triangle.rb
|
297
|
+
Run options: --seed 13073
|
308
298
|
|
309
299
|
# Running tests:
|
310
300
|
|
311
|
-
[
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
=>
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
301
|
+
[2, 11] in test-triangle.rb
|
302
|
+
2: require_relative 'triangle.rb'
|
303
|
+
3:
|
304
|
+
4: class TestTri < MiniTest::Unit::TestCase
|
305
|
+
5: def test_basic
|
306
|
+
6: byebug
|
307
|
+
=> 7: solutions = []
|
308
|
+
8: 0.upto(5) do |i|
|
309
|
+
9: solutions << triangle(i)
|
310
|
+
10: end
|
311
|
+
11: assert_equal([0, 1, 3, 6, 10, 15], solutions,
|
322
312
|
(byebug)
|
323
313
|
```
|
324
314
|
|
325
|
-
and we see that we are stopped at line
|
315
|
+
and we see that we are stopped at line 7 just before the initialization of the
|
326
316
|
list `solutions`.
|
327
317
|
|
328
318
|
Now let's see where we are...
|
329
319
|
```
|
330
|
-
(byebug)
|
331
|
-
|
332
|
-
|
320
|
+
(byebug) set nofullpath
|
321
|
+
Displaying frame's full file names is off.
|
322
|
+
(byebug) bt
|
323
|
+
--> #0 TestTri.test_basic at test-triangle.rb:7
|
324
|
+
#1 MiniTest::Unit::TestCase.run(runner#MiniTest::Unit) at .../2.0.0/minitest/unit.rb:1301
|
325
|
+
#2 MiniTest::Unit.block in _run_suite(suite#Class, type#Symbol) at .../2.0.0/minitest/unit.rb:919
|
326
|
+
#3 Array.map(frame_no#Fixnum) at .../2.0.0/minitest/unit.rb:912
|
327
|
+
#4 MiniTest::Unit._run_suite(suite#Class, type#Symbol) at .../2.0.0/minitest/unit.rb:912
|
328
|
+
#5 MiniTest::Unit.block in _run_suites(suites#Array, type#Symbol) at .../2.0.0/minitest/unit.rb:899
|
329
|
+
#6 Array.map(frame_no#Fixnum) at .../2.0.0/minitest/unit.rb:899
|
330
|
+
#7 MiniTest::Unit._run_suites(suites#Array, type#Symbol) at .../2.0.0/minitest/unit.rb:899
|
331
|
+
#8 MiniTest::Unit._run_anything(type#Symbol) at .../2.0.0/minitest/unit.rb:867
|
332
|
+
#9 MiniTest::Unit.run_tests at .../2.0.0/minitest/unit.rb:1060
|
333
|
+
#10 MiniTest::Unit.block in _run(args#Array) at .../2.0.0/minitest/unit.rb:1047
|
334
|
+
#11 Array.each(frame_no#Fixnum) at .../2.0.0/minitest/unit.rb:1046
|
335
|
+
#12 MiniTest::Unit._run(args#Array) at .../2.0.0/minitest/unit.rb:1046
|
336
|
+
#13 MiniTest::Unit.run(args#Array) at .../2.0.0/minitest/unit.rb:1035
|
337
|
+
#14 #<Class:MiniTest::Unit>.block in autorun at .../2.0.0/minitest/unit.rb:789
|
333
338
|
(byebug)
|
334
339
|
```
|
335
340
|
|
336
|
-
|
337
|
-
`TestTri` in method `test_basic`. However we don't see the call to this like we
|
338
|
-
did in the last example when we used the `where` command. This is because byebug
|
339
|
-
really didn't spring into existence until after we already had entered that
|
340
|
-
method, and Ruby doesn't keep call stack information around in a way that would
|
341
|
-
give the information we show when running `where`.
|
342
|
-
|
343
|
-
If we want call stack information, we have to turn call-stack tracking on
|
344
|
-
_beforehand_. This is done by adding `Byebug.start`.
|
345
|
-
|
346
|
-
Here's what our test program looks like after we modify it to start tracking
|
347
|
-
calls from the outset
|
348
|
-
|
349
|
-
```ruby
|
350
|
-
require 'test/unit'
|
351
|
-
require_relative 'triangle.rb'
|
352
|
-
require 'byebug'
|
353
|
-
Byebug.start
|
354
|
-
|
355
|
-
class TestTri < Test::Unit::TestCase
|
356
|
-
def test_basic
|
357
|
-
byebug
|
358
|
-
solutions = []
|
359
|
-
0.upto(5) do |i|
|
360
|
-
solutions << triangle(i)
|
361
|
-
end
|
362
|
-
assert_equal([0, 1, 3, 6, 10, 15], solutions,
|
363
|
-
"Testing the first 5 triangle numbers")
|
364
|
-
end
|
365
|
-
end
|
366
|
-
```
|
341
|
+
We get the same result as if we had run byebug from the outset, just faster!
|
367
342
|
|
368
|
-
|
369
|
-
|
370
|
-
$ ruby test-triangle.rb
|
371
|
-
Run options:
|
372
|
-
|
373
|
-
# Running tests:
|
374
|
-
|
375
|
-
[1/1] TestTri#test_basic[5, 14] in test-triangle.rb
|
376
|
-
5:
|
377
|
-
6: class TestTri < Test::Unit::TestCase
|
378
|
-
7: def test_basic
|
379
|
-
8: require 'byebug'
|
380
|
-
9: byebug
|
381
|
-
=> 10: solutions = []
|
382
|
-
11: 0.upto(5) do |i|
|
383
|
-
12: solutions << triangle(i)
|
384
|
-
13: end
|
385
|
-
14: assert_equal([0, 1, 3, 6, 10, 15], solutions,
|
386
|
-
(byebug) where
|
387
|
-
--> #0 TestTri.test_basic at test-triangle.rb:10
|
388
|
-
#1 MiniTest::Unit::TestCase.run_test(name#String)
|
389
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:858
|
390
|
-
#2 MiniTest::Unit::TestCase.run(runner#Test::Unit::Runner)
|
391
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:1301
|
392
|
-
#3 Test::Unit::TestCase.run(runner#Test::Unit::Runner)
|
393
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit/testcase.rb:17
|
394
|
-
#4 MiniTest::Unit._run_suite(suite#Class, type#Symbol)
|
395
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:919
|
396
|
-
#5 Array.map(suite#Class, type#Symbol)
|
397
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:912
|
398
|
-
#6 MiniTest::Unit._run_suite(suite#Class, type#Symbol)
|
399
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:912
|
400
|
-
#7 Test::Unit::Runner._run_suites(suites#Array, type#Symbol)
|
401
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:657
|
402
|
-
#8 Array.each(suites#Array, type#Symbol)
|
403
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:655
|
404
|
-
#9 Test::Unit::Runner._run_suites(suites#Array, type#Symbol)
|
405
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:655
|
406
|
-
#10 MiniTest::Unit._run_anything(type#Symbol)
|
407
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:867
|
408
|
-
#11 MiniTest::Unit.run_tests
|
409
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:1060
|
410
|
-
#12 MiniTest::Unit._run(args#Array)
|
411
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:1047
|
412
|
-
#13 Array.each(args#Array)
|
413
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:1046
|
414
|
-
#14 MiniTest::Unit._run(args#Array)
|
415
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:1046
|
416
|
-
#15 MiniTest::Unit._run(args#Array)
|
417
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:1042
|
418
|
-
#16 MiniTest::Unit.run(args#Array)
|
419
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/minitest/unit.rb:1035
|
420
|
-
#17 Test::Unit::RunCount.run(args#NilClass)
|
421
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:21
|
422
|
-
#18 Test::Unit::Runner.run(args#Array)
|
423
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:774
|
424
|
-
#19 #<Class:Test::Unit::Runner>.autorun
|
425
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:366
|
426
|
-
#20 Test::Unit::RunCount.run_once
|
427
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:27
|
428
|
-
#21 #<Class:Test::Unit::Runner>.autorun
|
429
|
-
at /home/davidr/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/test/unit.rb:367
|
430
|
-
#22 <main> at test-triangle.rb:6
|
431
|
-
(byebug)
|
432
|
-
```
|
433
|
-
|
434
|
-
Much better. But again let me emphasize that the parameter types are those of
|
435
|
-
the corresponding variables that _currently_ exist, and this might have changed
|
436
|
-
since the time when the call was made.
|
343
|
+
__NOTICE: In ruby-debug, debugger and older versions of byebug, this would not
|
344
|
+
work as expected. If you are having issues, please upgrade to byebug >= 1.5.0__
|
437
345
|
|
438
346
|
|
439
347
|
### Byebug.start with a block
|
@@ -461,12 +369,12 @@ For example, you can do this in `irb`:
|
|
461
369
|
```
|
462
370
|
$ irb
|
463
371
|
2.0.0p195 :001 > require 'byebug'
|
464
|
-
=> true
|
372
|
+
=> true
|
465
373
|
2.0.0p195 :002 > def foo
|
466
374
|
2.0.0p195 :003?> x=1
|
467
375
|
2.0.0p195 :004?> puts 'foo'
|
468
376
|
2.0.0p195 :005?> end
|
469
|
-
=> nil
|
377
|
+
=> nil
|
470
378
|
2.0.0p195 :006 > Byebug.start{byebug; foo}
|
471
379
|
(irb) @ 6
|
472
380
|
(byebug) s
|
@@ -477,8 +385,8 @@ $ irb
|
|
477
385
|
1
|
478
386
|
(byebug) s
|
479
387
|
foo
|
480
|
-
=> true
|
481
|
-
2.0.0p195 :007 >
|
388
|
+
=> true
|
389
|
+
2.0.0p195 :007 >
|
482
390
|
```
|
483
391
|
|
484
392
|
There is a counter inside of `Byebug.start` method to make sure that this works
|
@@ -486,6 +394,7 @@ when another `Byebug.start` method is called inside of the outer one. However,
|
|
486
394
|
if you are stopped inside byebug, issuing another `byebug` call will not have
|
487
395
|
any effect even if it is nested inside another `Byebug.start`.
|
488
396
|
|
397
|
+
|
489
398
|
### Debugging Oddities: How debugging Ruby may be different from other languages
|
490
399
|
|
491
400
|
If you are used to debugging in other languages like C, C++, Perl, Java or even
|
@@ -497,18 +406,12 @@ those other languages, writing a debugger has to also be a little different as
|
|
497
406
|
well if it is to be useful. In this respect, using byebug may help you
|
498
407
|
understand Ruby better.
|
499
408
|
|
500
|
-
We've already seen
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
this. In other languages call stack information is usually available without
|
507
|
-
asking assistance of the debugger (in C and C++, however, you generally have to
|
508
|
-
ask the compiler to add such information.).
|
509
|
-
|
510
|
-
In this section we'll consider some other things that might throw off new users
|
511
|
-
to Ruby who are familiar with other languages and debugging in them.
|
409
|
+
We've already seen one such difference: the fact that we stop on method
|
410
|
+
definitions or `def`'s and that is because these are in fact executable
|
411
|
+
statements. In other compiled languages this would not happen because that's
|
412
|
+
already been done when you compile the program (or in Perl when it scans in the
|
413
|
+
program). In this section we'll consider some other things that might throw off
|
414
|
+
new users to Ruby who are familiar with other languages and debugging in them.
|
512
415
|
|
513
416
|
* Bouncing Around in Blocks (iterators)
|
514
417
|
* No Parameter Values in a Call Stack
|
@@ -642,7 +545,7 @@ To be continued...
|
|
642
545
|
* line tracing and non-interactive tracing.
|
643
546
|
* mixing in Byebug.debug with byebug
|
644
547
|
* post-mortem debugging and setting up for that
|
645
|
-
|
548
|
+
|
646
549
|
|
647
550
|
## Getting in & out
|
648
551
|
|
@@ -751,7 +654,7 @@ Here are the default values in `options`
|
|
751
654
|
|
752
655
|
```ruby
|
753
656
|
#<OpenStruct annotate=nil, nx=false, quit=true, restart_script=nil, script=nil,
|
754
|
-
stop=true, tracing=false, verbose_long=false>
|
657
|
+
stop=true, tracing=false, verbose_long=false>
|
755
658
|
```
|
756
659
|
|
757
660
|
## Command Files
|
@@ -799,35 +702,17 @@ change the script and make an explicit call to byebug. Because byebug isn't
|
|
799
702
|
involved before the first call, there is no overhead and the script will run
|
800
703
|
at the same speed as if there were no byebug.
|
801
704
|
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
To tell byebug to start tracking things, do
|
814
|
-
|
815
|
-
```ruby
|
816
|
-
Byebug.start
|
817
|
-
```
|
818
|
-
|
819
|
-
There is also a `Byebug.stop` to turn off byebug tracking. If speed is crucial,
|
820
|
-
you may want to start and stop this around certain sections of code.
|
821
|
-
Alternatively, instead of issuing an explicit `Byebug.stop` you can add a block
|
822
|
-
to the `Byebug.start` and debugging is turned on for that block. If the block of
|
823
|
-
code raises an uncaught exception that would cause the block to terminate, the
|
824
|
-
`stop` will occur. See [here](Byebug.start with a block).
|
825
|
-
|
826
|
-
And finally to enter byebug
|
827
|
-
|
828
|
-
```ruby
|
829
|
-
byebug
|
830
|
-
```
|
705
|
+
To enter byebug this way, just drop `byebug` in whichever line you want to start
|
706
|
+
debugging at. You also have to require byebug somehow. If using bundler, it will
|
707
|
+
take care of that for you, otherwise you can use the ruby `-r` flag or add
|
708
|
+
`require 'byebug'` in the line previous to the `byebug` call.
|
709
|
+
|
710
|
+
If speed is crucial, you may want to start and stop this around certain sections
|
711
|
+
of code, using `Byebug.start` and `Byebug.stop`. Alternatively, instead of
|
712
|
+
issuing an explicit `Byebug.stop` you can add a block to the `Byebug.start` and
|
713
|
+
debugging is turned on for that block. If the block of code raises an uncaught
|
714
|
+
exception that would cause the block to terminate, the `stop` will occur. See
|
715
|
+
[Byebug.start with a block]().
|
831
716
|
|
832
717
|
When `byebug`is run, `.byebugrc` is read.
|
833
718
|
|
data/bin/byebug
CHANGED
@@ -76,9 +76,6 @@ def debug_program(options)
|
|
76
76
|
end
|
77
77
|
print "\032\032starting\n" if Byebug.annotate and Byebug.annotate > 2
|
78
78
|
|
79
|
-
# Record where we are we can know if the call stack has been truncated or not.
|
80
|
-
Byebug.start_sentinal = caller[0]
|
81
|
-
|
82
79
|
if bt = Byebug.debug_load(Byebug::PROG_SCRIPT, options.stop)
|
83
80
|
print bt.backtrace.map{|l| "\t#{l}"}.join("\n"), "\n"
|
84
81
|
print "Uncaught exception: #{bt}\n"
|
data/byebug.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_dependency "columnize", "~> 0.3.6"
|
27
27
|
s.add_dependency "debugger-linecache", '~> 1.2.0'
|
28
28
|
|
29
|
-
s.add_development_dependency 'rake', '~> 10.0
|
29
|
+
s.add_development_dependency 'rake', '~> 10.1.0'
|
30
30
|
s.add_development_dependency 'rake-compiler', '~> 0.8.3'
|
31
31
|
s.add_development_dependency 'mocha', '~> 0.14.0'
|
32
32
|
end
|
data/ext/byebug/byebug.c
CHANGED
@@ -25,13 +25,13 @@ tp_inspect(rb_trace_arg_t *trace_arg) {
|
|
25
25
|
if (ID2SYM(rb_intern("line")) == event ||
|
26
26
|
ID2SYM(rb_intern("specified_line")) == event)
|
27
27
|
{
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
VALUE sym = rb_tracearg_method_id(trace_arg);
|
29
|
+
if (NIL_P(sym)) sym = rb_str_new_cstr("<main>");
|
30
|
+
return rb_sprintf("%"PRIsVALUE"@%"PRIsVALUE":%d in `%"PRIsVALUE"'",
|
31
|
+
rb_tracearg_event(trace_arg),
|
32
|
+
rb_tracearg_path(trace_arg),
|
33
|
+
FIX2INT(rb_tracearg_lineno(trace_arg)),
|
34
|
+
sym);
|
35
35
|
}
|
36
36
|
if (ID2SYM(rb_intern("call")) == event ||
|
37
37
|
ID2SYM(rb_intern("c_call")) == event ||
|
@@ -53,9 +53,6 @@ tp_inspect(rb_trace_arg_t *trace_arg) {
|
|
53
53
|
static VALUE
|
54
54
|
Byebug_context(VALUE self)
|
55
55
|
{
|
56
|
-
if (context == Qnil) {
|
57
|
-
context = context_create();
|
58
|
-
}
|
59
56
|
return context;
|
60
57
|
}
|
61
58
|
|
@@ -133,15 +130,17 @@ call_at_line_check(VALUE context_obj, debug_context_t *dc,
|
|
133
130
|
call_at_line(context_obj, dc, file, line);
|
134
131
|
}
|
135
132
|
|
133
|
+
#define BYEBUG_STARTED (catchpoints != Qnil)
|
134
|
+
|
136
135
|
#define EVENT_SETUP \
|
137
136
|
rb_trace_arg_t *trace_arg = rb_tracearg_from_tracepoint(trace_point); \
|
138
|
-
VALUE context_obj; \
|
139
137
|
debug_context_t *dc; \
|
140
|
-
|
141
|
-
|
138
|
+
if (!BYEBUG_STARTED) \
|
139
|
+
rb_raise(rb_eRuntimeError, "Byebug not started yet!"); \
|
140
|
+
Data_Get_Struct(context, debug_context_t, dc); \
|
142
141
|
if (debug == Qtrue) \
|
143
142
|
printf("%s (stack_size: %d)\n", \
|
144
|
-
|
143
|
+
RSTRING_PTR(tp_inspect(trace_arg)), dc->stack_size); \
|
145
144
|
|
146
145
|
#define EVENT_COMMON() \
|
147
146
|
if (trace_common(trace_arg, dc) == 0) { return; }
|
@@ -187,7 +186,7 @@ process_line_event(VALUE trace_point, void *data)
|
|
187
186
|
}
|
188
187
|
|
189
188
|
if (RTEST(tracing))
|
190
|
-
call_at_tracing(
|
189
|
+
call_at_tracing(context, dc, file, line);
|
191
190
|
|
192
191
|
if (moved || !CTX_FL_TEST(dc, CTX_FL_FORCE_MOVE))
|
193
192
|
{
|
@@ -204,7 +203,7 @@ process_line_event(VALUE trace_point, void *data)
|
|
204
203
|
(!NIL_P(
|
205
204
|
breakpoint = find_breakpoint_by_pos(breakpoints, file, line, binding)))))
|
206
205
|
{
|
207
|
-
call_at_line_check(
|
206
|
+
call_at_line_check(context, dc, breakpoint, file, line);
|
208
207
|
}
|
209
208
|
|
210
209
|
cleanup(dc);
|
@@ -265,8 +264,8 @@ process_call_event(VALUE trace_point, void *data)
|
|
265
264
|
find_breakpoint_by_method(breakpoints, klass, mid, binding, self);
|
266
265
|
if (breakpoint != Qnil)
|
267
266
|
{
|
268
|
-
call_at_breakpoint(
|
269
|
-
call_at_line(
|
267
|
+
call_at_breakpoint(context, dc, breakpoint);
|
268
|
+
call_at_line(context, dc, file, line);
|
270
269
|
}
|
271
270
|
|
272
271
|
cleanup(dc);
|
@@ -324,8 +323,8 @@ process_raise_event(VALUE trace_point, void *data)
|
|
324
323
|
if (hit_count != Qnil)
|
325
324
|
{
|
326
325
|
rb_hash_aset(catchpoints, mod_name, INT2FIX(FIX2INT(hit_count) + 1));
|
327
|
-
call_at_catchpoint(
|
328
|
-
call_at_line(
|
326
|
+
call_at_catchpoint(context, dc, err);
|
327
|
+
call_at_line(context, dc, path, lineno);
|
329
328
|
break;
|
330
329
|
}
|
331
330
|
}
|
@@ -340,6 +339,7 @@ Byebug_setup_tracepoints(VALUE self)
|
|
340
339
|
|
341
340
|
breakpoints = rb_ary_new();
|
342
341
|
catchpoints = rb_hash_new();
|
342
|
+
context = context_create();
|
343
343
|
|
344
344
|
tpLine = rb_tracepoint_new(Qnil,
|
345
345
|
RUBY_EVENT_LINE,
|
@@ -392,7 +392,6 @@ Byebug_remove_tracepoints(VALUE self)
|
|
392
392
|
return Qnil;
|
393
393
|
}
|
394
394
|
|
395
|
-
#define BYEBUG_STARTED (catchpoints != Qnil)
|
396
395
|
static VALUE
|
397
396
|
Byebug_started(VALUE self)
|
398
397
|
{
|
@@ -463,7 +462,7 @@ Byebug_load(int argc, VALUE *argv, VALUE self)
|
|
463
462
|
Data_Get_Struct(context_obj, debug_context_t, dc);
|
464
463
|
if (RTEST(stop)) dc->steps = 1;
|
465
464
|
|
466
|
-
/*
|
465
|
+
/* Reset stack size to ignore byebug's own frames */
|
467
466
|
dc->stack_size = 0;
|
468
467
|
|
469
468
|
/* Initializing $0 to the script's path */
|
@@ -545,8 +544,6 @@ Byebug_breakpoints(VALUE self)
|
|
545
544
|
static VALUE
|
546
545
|
Byebug_catchpoints(VALUE self)
|
547
546
|
{
|
548
|
-
if (catchpoints == Qnil)
|
549
|
-
rb_raise(rb_eRuntimeError, "Byebug.start is not called yet.");
|
550
547
|
return catchpoints;
|
551
548
|
}
|
552
549
|
|
@@ -595,7 +592,7 @@ Init_byebug()
|
|
595
592
|
|
596
593
|
Init_breakpoint(mByebug);
|
597
594
|
|
598
|
-
context
|
595
|
+
context = Qnil;
|
599
596
|
catchpoints = Qnil;
|
600
597
|
breakpoints = Qnil;
|
601
598
|
|
data/ext/byebug/context.c
CHANGED
@@ -42,6 +42,13 @@ context_free(void *data)
|
|
42
42
|
|
43
43
|
}
|
44
44
|
|
45
|
+
static int
|
46
|
+
real_stack_size()
|
47
|
+
{
|
48
|
+
VALUE locs = rb_funcall(rb_cObject, rb_intern("caller_locations"), 1, INT2FIX(0));
|
49
|
+
return (int)RARRAY_LEN(locs);
|
50
|
+
}
|
51
|
+
|
45
52
|
extern VALUE
|
46
53
|
context_create()
|
47
54
|
{
|
@@ -50,7 +57,7 @@ context_create()
|
|
50
57
|
context->last_file = Qnil;
|
51
58
|
context->last_line = Qnil;
|
52
59
|
context->flags = 0;
|
53
|
-
context->stack_size =
|
60
|
+
context->stack_size = real_stack_size();
|
54
61
|
reset_stepping_stop_points(context);
|
55
62
|
context->stop_reason = CTX_STOP_NONE;
|
56
63
|
context->backtrace = Qnil;
|
@@ -187,7 +194,7 @@ call_with_debug_inspector(struct call_with_inspection_data *data)
|
|
187
194
|
if (frame_n < 0 || frame_n >= context->stack_size) \
|
188
195
|
{ \
|
189
196
|
rb_raise(rb_eArgError, "Invalid frame number %d, stack (0...%d)", \
|
190
|
-
|
197
|
+
frame_n, context->stack_size - 1); \
|
191
198
|
} \
|
192
199
|
|
193
200
|
static VALUE
|
@@ -335,9 +342,9 @@ Context_step_into(int argc, VALUE *argv, VALUE self)
|
|
335
342
|
context->steps = FIX2INT(steps);
|
336
343
|
|
337
344
|
if (RTEST(force))
|
338
|
-
|
345
|
+
CTX_FL_SET(context, CTX_FL_FORCE_MOVE);
|
339
346
|
else
|
340
|
-
|
347
|
+
CTX_FL_UNSET(context, CTX_FL_FORCE_MOVE);
|
341
348
|
|
342
349
|
return steps;
|
343
350
|
}
|
@@ -349,13 +356,14 @@ Context_step_over(int argc, VALUE *argv, VALUE self)
|
|
349
356
|
debug_context_t *context;
|
350
357
|
|
351
358
|
Data_Get_Struct(self, debug_context_t, context);
|
359
|
+
|
352
360
|
if (context->stack_size == 0)
|
353
361
|
rb_raise(rb_eRuntimeError, "No frames collected.");
|
354
362
|
|
355
363
|
rb_scan_args(argc, argv, "12", &lines, &frame, &force);
|
356
364
|
context->lines = FIX2INT(lines);
|
357
365
|
|
358
|
-
if (FIX2INT(frame) < 0
|
366
|
+
if (FIX2INT(frame) < 0 || FIX2INT(frame) >= context->stack_size)
|
359
367
|
rb_raise(rb_eRuntimeError, "Destination frame is out of range.");
|
360
368
|
context->dest_frame = context->stack_size - FIX2INT(frame);
|
361
369
|
|
@@ -371,9 +379,9 @@ static VALUE
|
|
371
379
|
Context_step_out(VALUE self, VALUE frame)
|
372
380
|
{
|
373
381
|
debug_context_t *context;
|
374
|
-
|
375
382
|
Data_Get_Struct(self, debug_context_t, context);
|
376
|
-
|
383
|
+
|
384
|
+
if (FIX2INT(frame) < 0 || FIX2INT(frame) >= context->stack_size)
|
377
385
|
rb_raise(rb_eRuntimeError, "Stop frame is out of range.");
|
378
386
|
|
379
387
|
context->stop_frame = context->stack_size - FIX2INT(frame);
|
data/ext/byebug/extconf.rb
CHANGED
data/lib/byebug.rb
CHANGED
@@ -36,9 +36,6 @@ module Byebug
|
|
36
36
|
# If in remote mode, wait for the remote connection
|
37
37
|
attr_accessor :wait_connection
|
38
38
|
|
39
|
-
# A string to look for in caller() to see if the call stack is truncated
|
40
|
-
attr_accessor :start_sentinal
|
41
|
-
|
42
39
|
def source_reload
|
43
40
|
Object.send(:remove_const, "SCRIPT_LINES__") if
|
44
41
|
Object.const_defined?("SCRIPT_LINES__")
|
@@ -111,7 +108,6 @@ module Byebug
|
|
111
108
|
Byebug.const_set('INITIAL_DIR', Dir.pwd) unless defined? Byebug::INITIAL_DIR
|
112
109
|
end
|
113
110
|
Byebug.tracing = options[:tracing] unless options[:tracing].nil?
|
114
|
-
Byebug.start_sentinal = caller[0]
|
115
111
|
if Byebug.started?
|
116
112
|
retval = block && block.call(self)
|
117
113
|
else
|
@@ -269,40 +265,3 @@ module Kernel
|
|
269
265
|
end
|
270
266
|
alias breakpoint byebug unless respond_to?(:breakpoint)
|
271
267
|
end
|
272
|
-
|
273
|
-
module Rails
|
274
|
-
module Rack
|
275
|
-
class Debugger
|
276
|
-
def initialize(app)
|
277
|
-
@app = app
|
278
|
-
|
279
|
-
# clear ARGV so that rails server options aren't passed to IRB
|
280
|
-
ARGV.clear
|
281
|
-
|
282
|
-
require 'byebug'
|
283
|
-
|
284
|
-
::Byebug.start
|
285
|
-
puts "=> Byebug enabled"
|
286
|
-
rescue LoadError
|
287
|
-
puts "You're missing the 'byebug' gem. Add it to your Gemfile, " \
|
288
|
-
"bundle it and try again."
|
289
|
-
exit
|
290
|
-
end
|
291
|
-
|
292
|
-
def call(env)
|
293
|
-
@app.call(env)
|
294
|
-
end
|
295
|
-
end
|
296
|
-
end
|
297
|
-
|
298
|
-
class Console
|
299
|
-
def require_debugger
|
300
|
-
require 'byebug'
|
301
|
-
puts "=> Byebug enabled"
|
302
|
-
rescue LoadError
|
303
|
-
puts "You're missing the 'byebug' gem. Add it to your Gemfile, bundle, " \
|
304
|
-
"it and try again."
|
305
|
-
exit
|
306
|
-
end
|
307
|
-
end
|
308
|
-
end
|
@@ -115,48 +115,6 @@ module Byebug
|
|
115
115
|
|
116
116
|
print frame_str
|
117
117
|
end
|
118
|
-
|
119
|
-
##
|
120
|
-
# Check if call stack is truncated. This can happen if Byebug.start is not
|
121
|
-
# called low enough in the call stack. An array of additional callstack
|
122
|
-
# lines from caller is returned if definitely truncated, false if not, and
|
123
|
-
# nil if we don't know.
|
124
|
-
#
|
125
|
-
# We determine truncation based on a passed in sentinal set via caller which
|
126
|
-
# can be nil.
|
127
|
-
#
|
128
|
-
# First we see if we can find our position in caller. If so, then we compare
|
129
|
-
# context position to that in caller using sentinal as a place to start
|
130
|
-
# ignoring additional caller entries. sentinal is set by byebug, but if it's
|
131
|
-
# nil then additional entries are presumably ones that we haven't recorded
|
132
|
-
# in context
|
133
|
-
def truncated_callstack?(sentinal=nil, cs=caller)
|
134
|
-
recorded_size = @state.context.stack_size
|
135
|
-
to_find_fl =
|
136
|
-
"#{@state.context.frame_file(0)}:#{@state.context.frame_line(0)}"
|
137
|
-
top_discard = false
|
138
|
-
cs.each_with_index do |fl, i|
|
139
|
-
fl.gsub!(/in `.*'$/, '')
|
140
|
-
fl.gsub!(/:$/, '')
|
141
|
-
if fl == to_find_fl
|
142
|
-
top_discard = i
|
143
|
-
break
|
144
|
-
end
|
145
|
-
end
|
146
|
-
if top_discard
|
147
|
-
cs = cs[top_discard..-1]
|
148
|
-
return false unless cs
|
149
|
-
return cs unless sentinal
|
150
|
-
if cs.size > recorded_size+2 && cs[recorded_size+2] != sentinal
|
151
|
-
# caller seems to truncate recursive calls and we don't.
|
152
|
-
# See if we can find sentinal in the first 0..recorded_size+1 entries
|
153
|
-
return false if cs[0..recorded_size+1].any?{ |f| f==sentinal }
|
154
|
-
return cs
|
155
|
-
end
|
156
|
-
return false
|
157
|
-
end
|
158
|
-
return nil
|
159
|
-
end
|
160
118
|
end
|
161
119
|
|
162
120
|
# Implements byebug "where" or "backtrace" command.
|
@@ -167,10 +125,6 @@ module Byebug
|
|
167
125
|
|
168
126
|
def execute
|
169
127
|
print_backtrace
|
170
|
-
if truncated_callstack?(Byebug.start_sentinal)
|
171
|
-
print \
|
172
|
-
"Warning: saved frames may be incomplete; compare with caller(0)\n"
|
173
|
-
end
|
174
128
|
end
|
175
129
|
|
176
130
|
class << self
|
data/lib/byebug/context.rb
CHANGED
data/lib/byebug/processor.rb
CHANGED
data/lib/byebug/version.rb
CHANGED
data/old_doc/test-triangle.rb
CHANGED
data/test/frame_test.rb
CHANGED
@@ -44,8 +44,8 @@ class TestFrame < TestDsl::TestCase
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'must set frame to the last one' do
|
47
|
-
enter 'break 16', 'cont', 'frame -1'
|
48
|
-
debug_file('frame') { state.file.must_match /
|
47
|
+
enter 'break 16', 'cont', 'bt', 'frame -1'
|
48
|
+
debug_file('frame') { state.file.must_match /minitest\/unit.rb/ }
|
49
49
|
check_output_doesnt_include "at #{fullpath('frame')}:"
|
50
50
|
end
|
51
51
|
|
@@ -65,6 +65,38 @@ class TestFrame < TestDsl::TestCase
|
|
65
65
|
interface.error_queue
|
66
66
|
end
|
67
67
|
|
68
|
+
describe 'when byebug is started deep in the callstack' do
|
69
|
+
it 'must print backtrace' do
|
70
|
+
enter 'break 16', 'cont', 'where'
|
71
|
+
debug_file 'frame_deep'
|
72
|
+
check_output_includes \
|
73
|
+
/--> #0 A.d(e#String) at #{fullpath('frame_deep')}:16/x,
|
74
|
+
/#1 A.c at #{fullpath('frame_deep')}:13/x,
|
75
|
+
/#2 A.b at #{fullpath('frame_deep')}:8/x
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'must go up' do
|
79
|
+
enter 'break 16', 'cont', 'up'
|
80
|
+
debug_file('frame_deep') { state.line.must_equal 13 }
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'must go down' do
|
84
|
+
enter 'break 16', 'cont', 'up', 'down'
|
85
|
+
debug_file('frame_deep') { state.line.must_equal 16 }
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'must set frame' do
|
89
|
+
enter 'break 16', 'cont', 'frame 2'
|
90
|
+
debug_file('frame_deep') { state.line.must_equal 8 }
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'must eval properly when scaling the stack' do
|
94
|
+
enter 'break 16', 'cont', 'p z', 'up', 'p z', 'up', 'p z'
|
95
|
+
debug_file('frame_deep')
|
96
|
+
check_output_includes 'nil', '3', '2'
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
68
100
|
describe 'fullpath' do
|
69
101
|
def short_path(fullpath)
|
70
102
|
separator = File::ALT_SEPARATOR || File::SEPARATOR
|
@@ -79,7 +111,8 @@ class TestFrame < TestDsl::TestCase
|
|
79
111
|
debug_file 'frame'
|
80
112
|
check_output_includes \
|
81
113
|
/--> #0 A.d(e#String) at #{fullpath('frame')}:16/x,
|
82
|
-
/#1 A.c at #{fullpath('frame')}:12/x
|
114
|
+
/#1 A.c at #{fullpath('frame')}:12/x,
|
115
|
+
/#2 A.b at #{fullpath('frame')}:8/x
|
83
116
|
end
|
84
117
|
end
|
85
118
|
|
@@ -91,7 +124,8 @@ class TestFrame < TestDsl::TestCase
|
|
91
124
|
debug_file 'frame'
|
92
125
|
check_output_includes \
|
93
126
|
/--> #0 A.d(e#String) at #{short_path(fullpath('frame'))}:16/x,
|
94
|
-
/#1 A.c at #{short_path(fullpath('frame'))}:12/x
|
127
|
+
/#1 A.c at #{short_path(fullpath('frame'))}:12/x,
|
128
|
+
/#2 A.b at #{short_path(fullpath('frame'))}:8/x
|
95
129
|
end
|
96
130
|
end
|
97
131
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: byebug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Rodríguez
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-06-
|
13
|
+
date: 2013-06-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: columnize
|
@@ -46,14 +46,14 @@ dependencies:
|
|
46
46
|
requirements:
|
47
47
|
- - ~>
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 10.0
|
49
|
+
version: 10.1.0
|
50
50
|
type: :development
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
54
|
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 10.0
|
56
|
+
version: 10.1.0
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: rake-compiler
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -172,6 +172,7 @@ files:
|
|
172
172
|
- test/examples/eval.rb
|
173
173
|
- test/examples/finish.rb
|
174
174
|
- test/examples/frame.rb
|
175
|
+
- test/examples/frame_deep.rb
|
175
176
|
- test/examples/help.rb
|
176
177
|
- test/examples/info.rb
|
177
178
|
- test/examples/info2.rb
|
@@ -262,6 +263,7 @@ test_files:
|
|
262
263
|
- test/examples/eval.rb
|
263
264
|
- test/examples/finish.rb
|
264
265
|
- test/examples/frame.rb
|
266
|
+
- test/examples/frame_deep.rb
|
265
267
|
- test/examples/help.rb
|
266
268
|
- test/examples/info.rb
|
267
269
|
- test/examples/info2.rb
|