2017-01-04 4 views
3

den folgenden Code Gegeben:Set bedingter Haltepunkt mit hebeln-byebug

require 'pry-byebug' 

10.times.with_index do |i| 
    binding.pry 
    puts i 
end 

würde Ich mag auf "Schleife, bis i == 5 dann brechen", während im Innern pry-byebug. Von der Ausführung help break scheint es, als ob Sie Breakpoints durch "Breakpoint #" oder "line #" identifizieren können. Es scheint auch, wie Sie Bedingungen verwenden können, aber ich bin nicht immer daran arbeiten:

Der Versuch, Haltepunkt auf Zeile # setzen:

$ ruby foo.rb 

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 : 

    1: require 'pry-byebug' 
    2: 
    3: 10.times.with_index do |i| 
    4: binding.pry 
=> 5: puts i 
    6: end 

[1] pry(main)> break foo.rb:5 if i == 5 

    Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 5 (Enabled) Condition: i == 5 


    2: 
    3: 10.times.with_index do |i| 
    4: binding.pry 
=> 5: puts i 
    6: end 


[2] pry(main)> continue 
0 

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 : 

    1: require 'pry-byebug' 
    2: 
    3: 10.times.with_index do |i| 
    4: binding.pry 
=> 5: puts i 
    6: end 

[2] pry(main)> i 
=> 1 

Erste Einstellung Haltepunkt dann Zustand auf Unterbrechungspunkt setzen:

➜ ~/D/w/t/pry_debug ruby foo.rb 

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 : 

    1: require 'pry-byebug' 
    2: 
    3: 10.times.with_index do |i| 
    4: binding.pry 
=> 5: puts i 
    6: end 

[1] pry(main)> break foo.rb:15 

    Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 15 (Enabled) 



[2] pry(main)> break --condition 1 i == 5 
[3] pry(main)> c 
0 

From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 : 

    1: require 'pry-byebug' 
    2: 
    3: 10.times.with_index do |i| 
    4: binding.pry 
=> 5: puts i 
    6: end 

[3] pry(main)> i 
=> 1 

Wie Sie sehen können, respektiert pry-byebug in beiden Fällen nicht die Bedingung, weil es zu früh stoppt. Wie bekomme ich es zur Arbeit?

Antwort

1

entfernen binding.pry von der Innenseite der Schleife und legen sie sie kurz vor 10.times:

binding.pry 
10.times.with_index do |i| 

Dann führen Sie den Code aus. Wenn es den Haltepunkt erreicht, dann setze einen neuen Haltepunkt mit der gewünschten Bedingung und continue.

Zurück zu Ihrem eigentlichen Code. Sie nicht tun:

10.times.with_index do |i| 

Stattdessen wird dies fast das gleiche tun, aber es ist einfacher:

10.times do |i| 

Hier ist, was Ruby tun:

>> 2.times.with_index.to_a 
[ 
    [0] [ 
    [0] 0, 
    [1] 0 
    ], 
    [1] [ 
    [0] 1, 
    [1] 1 
    ] 
] 

vs.

>> 2.times.to_a 
[ 
    [0] 0, 
    [1] 1 
] 

Die erste ist in Arra übergeben ys von [0,0], [1,1] usw., so dass für die Richtigkeit benötigen Blockparameter etwas sein wie:

10.times.with_index do |i, j| 

Die zweite nur den aktuellen „Zeit“ Wert übergibt, in dem einfacheren Code führt.

+0

Funktioniert es nicht, wenn die 'binding.pry' in der Schleife ist, weil ein" breakpoint "anders als ein' binding.pry' ist? Obwohl ich in meinem Beispiel einen Breakpoint gesetzt habe, treffe ich immer noch meine 'binding.pry' in jedem Durchlauf. – mbigras

+0

Ja, du bringst jedes Mal 'binding.pry' durch. Ruby hat keine Ahnung, dass "binding.pry" ein spezieller Befehl ist, den es nur einmal ausführen sollte, es ist nur ein Aufruf an eine Methode, soweit es das betrifft. Ein Breakpoint im Debugger tritt auf einer niedrigeren Ebene auf. Du solltest eine Weile mit Byebug spielen, außerhalb von Pry, und es wird mehr Sinn ergeben.Ich benutze fast immer byebug für mein Debugging, sobald ich vorbei bin, aber ich habe vor Jahren in der Assemblersprache angefangen, deshalb sind Debugger ziemlich natürlich für mich. –

+0

Würdest du sagen "byebug" ist wie "gdb"? – mbigras

5

Ich denke, eine einfache Möglichkeit, es in Ihrem Code zu tun ist:

require 'pry-byebug' 

10.times.with_index do |i| 
    binding.pry if i == 5 
    puts i 
end 

Oder alternativ, wenn Sie auf eine Ausnahme stoppen möchten, können Sie so etwas wie tun:

require 'pry-byebug' 

10.times.with_index do |i| 
    puts i rescue binding.pry # if the puts command throws an exception, you'll be taken to pry 
end 
Verwandte Themen